剑指Offer56-I 数组中出现两次的数

题目:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/submissions/

代码:

class Solution {
    public int[] singleNumbers(int[] nums) {
        int t = 0;
        for(int i=0; i<nums.length; i++){
            t ^= nums[i];
        }
        //求最右边的1的位置
        int p = 1;
        while((t & p) != p)
            p <<= 1;
        //将数组分为两份
        int res = 0;
        for(int n : nums){
            if((p & n) != 0){
                res ^= n;
            }
        }
        return new int[] {res, res^t};
    }
}

ps:最开始使用list存储划分后的数组,效率特别低,后面意识到其实根本不用开数组,只要一个变量存结果就好。(求t最低位的1,可以用t&(-t))