题目:
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
根据题目关于空间、时间复杂度的要求,不能使用简单的遍历数组然后比较方式来解决这个问题,使用位运算。
异或运算。异或运算有一个重要的性质:任何一个数字与自己异或的结果是0
具体步骤如下:
初始化一个变量
result
为0。遍历数组中的每一个元素,并将其与
result
进行异或运算。遍历结束后,
result
中存储的就是只出现一次的元素,因为成对出现的元素在异或运算中会互相抵消。
- 时间复杂度: O(n),其中 n 是数组的长度。只需要遍历一次数组。
- 空间复杂度: O(1),只使用了常量空间来存储结果。
public class no_169 {public static void main(String[] args) {int[] nums = {4, 1, 2, 1, 2};System.out.println(singleNumber(nums));}public static int singleNumber(int[] nums) {int re = 0;for (int num : nums) {re ^= num;}return re;}
}