消失的数字
数组arr包含从0到n的所有整数,但是其中缺少了一个,请编写代码找出缺失的那个整数。要求时间复杂度O(N)
从0到n应该有n+1个数字,缺少一个那么该数组元素个数为n。
思考1:
假如将该数组元素全部相加所得到的和,与正常不缺少该数字的数组之和相减,那么得到的数字就是缺少的数字。
假设该数组为arr[7]={0,1,2,3,4,5,7}。
#include <stdio.h> int main() { int arr[7]={0,1,2,3,4,5,7}; int i; int sz; int sum=0;//记录缺失数组元素之和 int ful=0;//记录完整数组元素之和 sz=sizeof(arr)/sizeof(arr[0]); for(i=0;i<sz;i++) { sum+=arr[i]; } for(i=0;i<=sz;i++)//此处元素个数要比sz多一个 { ful+=i; } printf("缺失的数字为%d ",ful-sum); return 0; }
思考2:
异或的特性,相同数字异或是0,异或结果不受顺序影响,那么将残缺数组所有元素与完整数组所有元素全部异或,结果很显然会仅剩下残缺数组里缺少的那个元素。
#include <stdio.h> int main() { int arr[7]={0,1,2,3,4,5,7}; int i; int sz; int ret=0;//记录异或结果,因0与任何数异或结果都是任何数,所以初始化为0 sz=sizeof(arr)/sizeof(arr[0]); for(i=0;i<sz;i++) { ret^=arr[i]; } for(i=0;i<=sz;i++)//此处元素个数要比sz多一个 { ret^=i; } printf("缺失的数字为%d ",ret); return 0; }
浙公网安备 33010602011771号