• 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也是类似哇

  • 相关阅读:
    静态成员变量
    设计模式:空对象模式(Null Object Pattern)
    超详细LAMP环境搭建
    WCF 学习笔记之双工实现
    new和instanceof的内部机制
    C#开源磁盘/内存缓存引擎
    C++设计模式-Flyweight享元模式
    Javascript内存泄漏
    流量计数器
    运用Mono.Cecil 反射读取.NET程序集元数据
  • 原文地址:https://www.cnblogs.com/crane-practice/p/3611919.html
Copyright © 2020-2023  润新知