上海华为的一道关于指针方面的编程题(C/C++)

int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int
Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。

尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路

注:我的方法的复杂度为O(n),大家如果有其它方法希望可以交流一下。

/*

author:

jiangxin

Blog:

http://blog.csdn.net/jiangxinnju

*/

#include <iostream>

#include <random>

using namespace std;

#define ARRAYSZIE 100

int Func(int* A,int nSize)

{

int *p_zero = A; //指向最开始的零值

int *p_unzero = A; //指向最后的非零值

while(1)

{

for(int i=(p_zero-A); i<nSize; i++)

{

if(A[i] == 0) //找到第一个零值

{

p_zero = &A[i];

break;

}

if(i == nSize-1) //没有找到零值,说明全部为非零值

{

return -1;

}

}

for(int i=(p_zero-A+1); i<nSize; i++)

{

if(A[i] != 0) //找到零值之后的第一个非零值

{

p_unzero = &A[i];

break;

}

if(i == nSize-1) //没有找到下一个非零值,说明全部为零值,或者已经排序完毕

{

return (p_zero-A);

}

}

*p_zero = *p_unzero;

*p_unzero = 0;

p_zero++;

}

}

void test_exercise001()

{

int A[ARRAYSZIE];

default_random_engine e;

uniform_int_distribution<> d(0,1);

for(int i=0; i<ARRAYSZIE; i++)

{

A[i] = d(e); //随机产生0和1值

}

for(int i=0; i<ARRAYSZIE; i++)

{

cout << A[i] << " ";

}

cout << "\nThe position of the first zero is: " << Func(A,ARRAYSZIE) << endl;

for(int i=0; i<ARRAYSZIE; i++)

{

cout << A[i] << " ";

}

}

上海华为的一道关于指针方面的编程题(C/C++),布布扣,bubuko.com

时间: 2024-08-24 00:42:03

上海华为的一道关于指针方面的编程题(C/C++)的相关文章

一道有意思的C语言编程题

最近在看经典的C语言入门书籍K&R,虽然是一本入门书籍,可是其中的精妙之处却需要慢慢体会.其中的经典题很多,仔细琢磨一定会收获良多. 今天看到这样一道题:编写一个删除C语言程序中所有的注释语句.感觉颇有意思,与大家一起分享一下: 我的思路: 找到注释的起始符号 \ 判断紧接着的输入字符,如果是*或者是\,则说明后面全是注释,跳过即可,否则照样输出 其他则直接输出 疑问: 所配套的答案书中提出要考虑引号后面的内容以做出响应,不是很明白这是为什么.个人认为无需考虑引号的影响也能将注释去除,希望有高手

一道考察数组知识的编程题

今天先贴代码,下次补上整体思路与后续优化 题目:假设有一个集合 ['foo', 'bar', 'hello', 'world'],求这个集合里单词组合起来的所有不同的结果. 1 let arr = ['foo', 'bar', 'hello', 'world'], 2 str = '', 3 newArr = [], 4 results = []; 5 6 for (let i = 0; i < 99; i++) { 7 newArr.push(arr.sort(() => { 8 retur

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。

只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/5882357.html.看了下,挺有意思,于是就想了想,又写了写,最终撸出来了.刚开始一看顿时感觉很熟悉,大学数据结构和算法课肯定讲过相关东西,什么深度搜索,广度搜索,最优路径,最优解...但是现在你让我说个一二三,我还就只记住几个名字,说不定名字都记错.我向来不喜欢死记东西,能查到的真的不想背下来,而

一道编程题实在是不知道哪个地方错了

求帮忙 一道觉得很简单的编程题,提交了很多次,但是,还是wrong,实在是崩溃啊,真的不知道哪里错了,希望大家可以帮忙解决一下,感激不尽. 就是这道题----Conversions Description Conversion between the metric and English measurement systems is relatively simple. Often, it involves either multiplying or dividing by a constant

华为的一道机试题--等式变换

华为的一道机试题 (http://blog.csdn.net/zombie_slicer/article/details/37346025) 第三题:等式变换 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立. 1 2 3 4 5 6 7 8 9 = X 比如: 12-34+5-67+89 = 5 1+23+4-5+6-7-8-9 = 5 请编写程序,统计满足输入整数的所有整数个数. 输入:       正整数,等式右边的数字 输出:       使该等式成立的个数 样

求职 | 华为研发工程师编程题个人题解【C++】【Python】

华为研发工程师编程题[C++][Python][数学][数组][字符串] 问题1 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?"答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入描述: 输入文件最多包

一道很有意思的java线程题

这几天看结城浩的<java多线程设计模式>,跟着做一些习题,有几道题目很有意思,记录下自己的体会. 首先是题目(在原书212页,书尾有解答): public class Main { public static void main(String[] args) { try { Blackhole.enter(new Object()); } catch (InterruptedException e) { e.printStackTrace(); } } } public class Blac

一道int与二进制加减题

int dis_data = 32769; if( dis_data > 0x7fff)  dis_data -= 0xffff; printf("%d\n",dis_data); 上面的dis_data 输出值会是多少?  初一看可能还看不出来,那就计算一下: 0x7fff转换为十进制为 32767,显然 dis_data > 0x7fff, 所以要执行 dis_data -= 0xffff;这一句代码. 现在dis_data = 32769, 那么 0xffff转换为十

编程题:使用指向指针的指针

#include<stdio.h> void main() { static char *str[]={"How","are","you"}; char **p; p=str+1; printf("%s\n",*p); printf("%c\n",**p); } 编程题:使用指向指针的指针,布布扣,bubuko.com