标签:
题目要求:给出一个数组,只有一个数字出现一次,其他的都出现两次,找出那出现一次的数字,要求用线性的时间解出题目!
分析:因为题目要求的是用线性时间,所以类似于那种暴力解决的方法会超时,如下面这种:
int singleNumber2(int *nums,int n) { int i,j; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(nums[i]==nums[j]) break; else continue; } if(j==n) return nums[i]; } return 0; }所以线性时间要求从前到后扫描一遍,且空间复杂度也是o(1),就可以利用位运算。由a^b=b^a,且(a^b)^b=a,(a^b)^a=b,所以对全部的元素异或得到的就是出现一次的那个数字。
代码如下:
#include<stdio.h> #include<stdlib.h> int singleNumber1(int*nums,int numsSize) { int i,tmp=nums[0]; for(i=1;i<numsSize;i++) { tmp=tmp^nums[i]; } return tmp; } int main() { int n,i; while(scanf("%d",&n)!=EOF) { int *num=(int *)malloc(sizeof(int)*n); for(i=0;i<n;i++) scanf("%d",&num[i]); printf("Single Number is %d\n",singleNumber1(num,n)); } return 0; }
标签:
原文地址:http://blog.csdn.net/zyh920521/article/details/46331081