260.[LeetCode]Single Number III

来源:互联网 发布:淘宝茶叶排名 编辑:程序博客网 时间:2024/05/20 23:57

简直是药开动大脑,如果理解上一道类型题为什么要用异或,那么这一道题也是很好理解的

// 明确只有两个是唯一的,其他都是成对的// 返回的数组不要求顺序// 线性时间,常量空间public class Solution {    public int[] singleNumber(int[] nums) {        int[] str = new int[2];        int size = nums.length;        int con = 0;        for(int i=0;i<size;i++){            con ^= nums[i];        }        //con是 两个不同的独数,做异或之后的数        int lastBit = (con & (con-1)) ^ (con);        // 也可以是 lastBit = (con & (~(con-1)));        int index1=0;        int index2=0;        for(int i=0;i<size;i++){            // 这里是全题的拍脑瓜时刻:            // lastbit标识的两个独数的最后一位 不相同的 位置            // 全部的数可以分为,在lastBit处有1和在lastbit处没有1            // 只要将有1和没有1的分开做异或运算!相当于分成了两个简单的在找唯一一个不同数            int temp = lastBit & nums[i];            if(temp!=0){                index1 ^= nums[i];            } else {                index2 ^= nums[i];            }        }        str[0] = nums[index1];        str[1] = nums[index2];        return str;    }}
0 0
原创粉丝点击