Single Number II

转自:http://blog.csdn.net/kenden23/article/details/13625297

1    int singleNumber(int A[], int n) {  
2         for(int i = 0; i < n; i++)  
3         {  
4             if(count(A, A + n, A[i])<2)  
5                 return i;  
6         }  
7     }  

时间复杂度O(n*n)

这类题目排序都是可以做的,先排序,再扫描,时间复杂度O(nlgn)

 1     int singleNumber(int A[], int n) {
 2         if(A==NULL||n<=0)
 3             return 0;
 4         sort(A,A+n);
 5         int i;
 6         for(i=0;i<n-2;++i)
 7         {
 8             if(A[i]==A[i+1]&&A[i]==A[i+2])
 9                 i+=3;
10             else
11                 return A[i];
12         }
13     }

Submission Result: Wrong Answer

Input: [1]
Output: -256
Expected: 1
 1     int singleNumber(int A[], int n) {
 2         if(A==NULL||n<=0)
 3             return 0;
 4         if(n<=2)
 5             return A[0];
 6         sort(A,A+n);
 7         int i;
 8         for(i=0;i<n-2;++i)
 9         {
10             if(A[i]==A[i+1]&&A[i]==A[i+2])
11                 i+=3;
12             else
13                 return A[i];
14         }
15     }

Status: Wrong Answer

Input: [2,2,3,2]
Output: 0
Expected: 3

根据错误提示分析:

n=4   i=0

排序后:2,2,2,3  

A[0]=A[1]=A[2]

i=3

i<n-2——>3<2不成立,然后呢,就木有然后了

 1     int singleNumber(int A[], int n) {
 2         if(A==NULL||n<=0)
 3             return 0;
 4         //if(n<=2)
 5             //return A[0];
 6         sort(A,A+n);
 7         int i=0;
 8         while(i<n-2)
 9         {
10             if(A[i]==A[i+1]&&A[i]==A[i+2])
11                 i+=3;
12             else
13                 break;
14         }
15         return A[i];
16     }

AC

PS:现在发现用for越来越不顺手了,下面有个i+=3,然后for里有个习惯性的++i,然后就出错了······

O(n)的解法:http://www.cnblogs.com/daijinqiao/p/3352893.html

对于除出现一次之外的所有的整数,其二进制表示中每一位1出现的次数是3的整数倍,将所有这些1清零,剩下的就是最终的数。

上面那句话说的太好啦,赞一个,可惜代码没看懂

http://www.cppblog.com/Uriel/articles/205406.html

我自己写的,错的,错在14行

 1     int singleNumber(int A[], int n) {
 2         if(A==NULL||n<=0)
 3             return 0;
 4         int i,j,bit,result=0;//bit记录所有数某一位加起来mod3之后每位是0还是1
 5         int b=1;//b用来取得数的某一位
 6         //unsigned int b=1;
 7         for(i=0;i<32;i++)//int有32位,虽然是双重循环,但时间复杂度是O(n)
 8         {
 9             bit=0;
10             for(j=0;j<n;++j)
11             {
12                 bit+=(b&A[j]);
13             }
14             //bit%=3;//可以放心地说余数只会是0或者1  //呃,这里错了,以为这里一次只有一位,其实不是的哇
15             result |= bit;
16             b<<1;
17         }//每次循环得到一位,循环结束做或操作
18         return result;
19     }
 1     int singleNumber(int A[], int n) {
 2         if(A==NULL||n<=0)
 3             return 0;
 4         int i,j,result=0;
 5         int b=1;//b用来取得数的某一位
 6         //unsigned int b=1;  两个都可以
 7         int count;//记录所有数某一位加起
 8         for(i=0;i<32;i++)//int有32位,虽然是双重循环,但时间复杂度是O(n)
 9         {
10             count=0;
11             for(j=0;j<n;++j)
12             {
13                 if(b&A[j])
14                     count++;
15             }
16             count%=3;//余数只可能是0或者1
17             if(count)
18                 result |= b;
19             b<<1;
20         }//每次循环得到一位,循环结束做或操作
21         return result;
22     }

Submission Result: Wrong Answer

Input: [2,2,3,2]
Output: 1
Expected: 3

哪里错啦,思路那么清晰,后来我把代码放到codeblocks中,人家提示说:E:yxycodeblocksdfasdsadsmain.cpp|24|warning: statement has no effect [-Wunused-value]|      注:codeblocks中的24行对应上面代码的19行

后来,把第19行改成了b=b<<1;就AC啦,唉,如果是b+1,那我知道没有用,b值不变,b<<1也是类似哇

原文地址:https://www.cnblogs.com/crane-practice/p/3611919.html