蹬蹬登登

导航

两个有意思的算法题

1. 一个大小为n的数组,元素为从(0,1,2,...,n)这n+1个数中任选出的n个数,找出漏掉的哪一个数

要求:时间复杂度:O(n),空间复杂度为常数。

思路1:n+1个数的和为n*(n+1)/2,用它依次减数组中的所有元素,最后得到的差即为漏掉的数

缺点:n数量很大的时候,数n*(n+1)/2可能造成溢出从而出错

代码:

1 int MissingNumber(int[] nums) {
2     int result = nums.Length * (nums.Length + 1) / 2;
3     for(int i = 0; i < nums.Length; i++)
4         result -= nums[i];
5     return result;
6 }

思路2:异或法,用n对数组内的所有元素和0-n-1进行亦或,最后的结果就是漏掉的那个数了。

原理:异或具有交换性,假设漏掉的数为k,则这种亦或可以看成是(0~k-1)+(0~k-1)+(k+1~n)+(k+1~n)+k,异或打不出来,用+代替,则结果为k

代码:

int missingNumber(int[] nums) { //xor
2     int res = nums.length;
3     for(int i=0; i<nums.length; i++){
4         res ^= i;
5         res ^= nums[i];
6     }
7     return res;
8 }

 

posted on 2015-09-28 14:19  蹬蹬登登  阅读(171)  评论(0)    收藏  举报