关于数组的一些面试题目

1、google面试题: (1)一个数组存放了2n+1个整数,其中有n个数出现了2次,1个数出现了1次,找出出现1次的数是多少?(可能不少人遇到过,但是当时 我是第一次遇到,我把我的经过给大家讲一遍) A. 由于想在最短时间内解决,我首先想到最简单的办法,使用映射统计的办法,借助辅助数组(长度为n+1,元素为一结构体(包含数值和 个数两个成员))进行计数,但是时间复杂度为O(n*n),空间复杂度为O(n+1),面试官让我改进。 B. 接着我在纸上划划,发现如果排序后重复2次的都排在一起, 如: (3,3),(5,5),(18,18),(26,57),57 那么只需要每两两考察是否一样,如果不一样(蓝色标志)则只出现1次的数(26)必定出现在左边。解法:使用快速排序对数组进行 排序,再两两元素进行比较,相等则继续前面操作,否则输出左边的元素值。 时间复杂度为O(nlogn)。 面试官继续询问有没更好的办法,我想时间复杂度一定是线性的O(2n+1) C. 当时我没能想出来,后来回去后找到了解法:对数组A的所有元素做异或,即A[0]异或A[1]…… 异或A[2n]结果就是答案,理由:相同的数异或等于0,而0和任何数以后等于任何数,且异或运算可交换。 2、深信服面试:1、google面试题的变形:一个数组存放若干整数,1个数出现了奇数次,其余数出现偶数次,找出出现奇数次的数是多少? 解法跟上一题一样使用异或运算 3、google面试:给定一个存放整数的数组,需要找出其中两个之和等于一指定的值,没有则返回提示。 解法(如果有更好的办法,请圆友分享一下): (1)先排序,再使用两个int变量low和high标记当前考察的两个元素的下标,一前一后,初始化 low=0,high=n-1(数组A长度) (2)如果low<high int findtwo a n sum low="0,high=n-1;" while if cout return else>sum) { high--; } else { low++; } } cout=0) { if(key%2==1) { if(A[j]%2==1) { break; } } else { break; } j--; } for(int m=i-1;m&gt;j;m--) { A[m+1]=A[m]; } A[j+1]=key; } } 解法2:使用快速排序中Partition寻找枢轴位置中的高低端交换思想,只是把判断条件改为low下标元素为奇数则low++,否则low、high下标元素交换;high下标元素为偶数则high--,否则low、high下标元素交换。 代码: void ArrangePartition1(int A[],int low,int high) { while(low<high while high-- if int temp="A[high];" a low void arrangeinsert2 n key="0;" for i="1;i&lt;n;i++)" j="i-1;">=0) { if(key%2==1) { if(A[j]%2==1&amp;&amp;A[j]<key break else if j-- for m="i-1;m">j;m--) { A[m+1]=A[m]; } A[j+1]=key; } } 解法2:对上面的解法2修改。 使用快速排序的思想,其中Partition(寻找枢轴位置函数)把 (1)若枢轴元素为偶数,对high下标元素判断条件改为如果为偶数并且大于枢轴元素,high--,否则与low下标元素交换;对low下标元素判断条件改为如果low元素为奇数或者为偶数且小于枢轴元素,low++,否则与high下标元素交换。 (2)若枢轴元素为奇数,对high下标元素判断条件改为如果为偶数或者大于枢轴元素,high--,否则与low下标元素交换;对low下标元素判断条件改为如果low元素为奇数并且小于枢轴元素,low++,否则与high下标元素交换。 代码: int ArrangePartition2(int A[],int low,int high) { int key=A[low]; while(low<high while if break else high-- int temp="A[high];" a>key) { break; } } else { if(A[low]%2==0||A[low]&gt;key) { break; } } low++; } if(low<high int temp="A[high];" a return low void quickarrange high if pos="ArrangePartition2(A,low,high);"><div class="share_buttons" id="sharePanel"></div> <div class="article_next_prev"> <li class="prev_article"> <span>上一篇:</span><a href="http://blog.csdn.net/hxxiaopei/article/details/5906469">中秋看房有感</a> </li> <li class="next_article"> <span>下一篇:</span><a href="http://blog.csdn.net/hxxiaopei/article/details/6009881">排序之线性排序(counting sort, radix-sort, bucket-sort)</a> </li> </div> </high></high></key></high></high>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值