只出现一次的数字(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]; }