zoukankan      html  css  js  c++  java
  • leetcode 136 231

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int s = nums[0];
            for(int i=1; i<nums.size(); i++){
                s = s ^ nums[i];
            }
            return s;
        }
    };

    题意:数组里只有两个出现一次的数,其余是出现两次的数,找出这两个只出现一次的数。

    思路:延续上一题的思路,先将所有数相异或,因为相同的数异或为0,所以异或的结果为两个只出现一次的数异或后的结果。然后使用 res = s & (~(s-1)) 从中取出二进制数值位为1的最低位。因为对于这一位,相应的那两个数肯定是不同的。然后将res再与数组里的数与,会得到一组值为0,和一组值不为0的两堆,而这两个数肯定是分开出现在两堆的。最后将这两堆分别做异或操作,得到的值就是只出现一次的数。

    注意:运算符的优先级,& 优先级小于 ==

    class Solution {
    public:
        vector<int> singleNumber(vector<int>& nums) {
            int s = 0;
            for(int i=0; i<nums.size();i++){
                s ^= nums[i];
            }
            int res = s & (~(s-1));
            vector<int> n(2,0);
            
            for(int i=0; i<nums.size();i++){
                if( (res&nums[i])==0){
                    n[0] ^= nums[i];
                }  
                else{
                    n[1] ^= nums[i]; 
                }      
            }
            return n;
        }
    };
  • 相关阅读:
    25号了
    9月特别日程
    26日 晴
    8月22日 出游时间更改
    雷雨过后
    28日 多云
    080826 小雨(补记)
    080822 阴
    27日 晴
    IOS 5 ARC机制 (一)
  • 原文地址:https://www.cnblogs.com/Bella2017/p/10910702.html
Copyright © 2011-2022 走看看