136. 只出现一次的数字
难度简单
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
方法一:暴力算法,双重遍历,并作标记,暴力的找出没有重复的元素。当然,该算法不具有线性时间复杂度。
1 int singleNumber(int* nums, int numsSize){ 2 int i,j,flag=1; 3 for(i=0;i<numsSize;i++){ 4 flag=1; 5 for(j=0;j<numsSize;j++){ 6 if(i==j){ 7 continue; 8 }else if(nums[i]==nums[j]){ 9 flag=0; 10 break; 11 } 12 } 13 if(flag==1){ 14 break; 15 } 16 } 17 return nums[i]; 18 }
方法二:快速排序+遍历数组,该方法符合题目要求,但并不是最优解。
1 int cmp(const void *a,const void *b) 2 { 3 return *(int*)a-*(int*)b; 4 } 5 int singleNumber(int* nums, int numsSize){ 6 qsort(nums,numsSize,sizeof(nums[0]),cmp); 7 int i; 8 for(i=0;i<numsSize-1;i++){ 9 if(nums[i]==nums[i+1]){ 10 i++; 11 }else{ 12 return nums[i]; 13 } 14 } 15 return nums[numsSize-1]; 16 }
方法三:位运算,异或操作(^),因为a^a=0,而a^a^b=b,所以我们使用异或,可以最快速的解决这道题目。
1 int singleNumber(int* nums, int numsSize){ 2 int i,k=nums[0]; 3 for(i=1;i<numsSize;i++){ 4 k=k^nums[i]; 5 } 6 return k; 7 }