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

剑指 Offer 56 - I. 数组中数字出现的次数
大意:找出数组中只出现一次的两个数(其它出现两次)

<details> <summary>思路 & 代码 </summary> 思路:首先需要知道一个前置问题:找出数组中只出现一次的一个数(其它出现两次),显然,对整个数组进行异或操作即可。那么,我们是否有可能将本题中的数组分隔成两部分呢(不要求连续)?答案是肯定的:我们仍然对整个数组进行异或操作,结果记为 xorS(两个特殊的数的异或值),注意到 xorS 中的每一位 1 都只属于两个特殊数中的某一个,记最低位为 lowNoZeorBit,所以这里以数组中 lowNoZeroBit 位是否为 1 为界限,可将数组分隔成两部分,且这两部分异或值即为最终的两个特殊的数

时间:O(n),空间:O(1)

class Solution {
    public int getLowNoZeroBit(int s) {
        int bit = 0;
        // 区别于「快速幂」
        while(s > 0) {
            bit++;
            if((s&1) == 1) break;
            s >>= 1;
        }
        return bit;
    }

    public int[] singleNumbers(int[] nums) {
        int xorS = 0;
        for(int num : nums) xorS ^= num;
        int lowNoZeroBit = getLowNoZeroBit(xorS);
        /*
        0010 
        1010
        System.out.println(lowNoZeroBit); // 4
        */
        int[] ans = new int[2];
        for(int num : nums) {
            ans[(num >> (lowNoZeroBit-1)) & 1] ^= num;
        }
        return ans;
    }
}
</details>
全部评论

相关推荐

真起不了响亮的名字:九月份人家投秋招你投实习嘛,会不会有点晚了,算你九月份直接上岗,实习三个月后一月初去和别人抢秋招补录还是备战春招啊更别说休息一个月后还要重新复习八股和算法
点赞 评论 收藏
分享
人力小鱼姐:实习经历没有什么含金量,咖啡店员迎宾这种就别写了,其他两段包装一下 想找人力相关的话,总结一下个人优势,结合校园经历里有相关性的部分,加一段自我评价
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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