只出现一次的数字(136. 只出现一次的数字)

题目:

思路:

【1】这种如果做题做得多的话大概一瞬间便会有思路了,利用字节的位来进行异或,由于只存在一个元素是单独的,而其他的都会存在两次,那么基于异或的相同数字会等于0,也就是相当于清空了,则剩下的唯一的不可被清除的就是那个单独的元素。

【2】而限制则会是两个,常量额外空间即空间复杂度为O(1),代表了不能使用set之类的集合,因为不能确定长度的话,那么空间复杂度就会是N,就不满足常量了。另外线性时间复杂度,代表时间复杂度为O(N)

代码展示:

class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for (int i = 0; i < nums.length; i++)
            result =result^nums[i];
        return result;
    }
}

当然如果取消了空间复杂度的限制的话,那么使用set的方式便是我们最常用的:

public int singleNumber(int[] nums) {
    Set<Integer> set = new HashSet<>();
    for (int num : nums) {
        if (!set.add(num)) {
            //如果添加失败,说明这个值
            //在集合Set中存在,我们要
            //把他给移除掉
            set.remove(num);
        }
    }
    //最终集合Set中只有一个元素,我们直接返回
    return (int) set.toArray()[0];
}
posted @ 2023-01-04 12:47  忧愁的chafry  阅读(19)  评论(0编辑  收藏  举报