两个有意思的算法题
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 }
浙公网安备 33010602011771号