题解 | #调整数组顺序使奇数位于偶数前面#

数组中只出现一次的两个数字

http://www.nowcoder.com/practice/389fc1c3d3be4479a154f63f495abff8

一看到什么,某些数字出现了多少次,某些只出现了多少次都可以考虑N进制的加法,2进制的加法也就是异或

  • 全部异或结果等于a^b,因为其他数都是出现了两次,异或是2进制的加法,所以两次异或后就是0

  • 根据最后一位是1还是0将数字划分成两批,a和b就被分开了,这两批分别全部异或起来就能得到a,b

      public int[] FindNumsAppearOnce (int[] array) {
          if(array==null||array.length<2) return new int[]{};
          //1.全部异或一遍,结果变成了那两个数a^b
          int N = array.length;
          int res = 0;
          for(int i = 0;i<N;i++){
              res^=array[i];
          }
          //2.抓出能够体现a,b不同的特点,由于res=a^b,比如假设是01000110
          //由于是异或运算,那么最后一个1的位置肯定是a、b有一个为1,一个为0
          //由这个点进行区分:
          //3.将最后一个1抓出来
          int lastOne = res&((~res)+1);//~res+1 = 10111010->res&(~res+1)
                                     //         01000110
                                     //         00000010->抓到最后一位1了
          int a = 0;
          for(int i = 0;i<N;i++){
              if((array[i]&lastOne)!=0){
                  //这就是包含了那一位为1的情况
                  a^=array[i];
              }
          }
          int b = res^a;
          return a<b?new int[]{a,b}:new int[]{b,a};
      }
    

```

全部评论

相关推荐

05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务