携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
一、题目描述:
136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com)
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
二、思路分析:
很明显,最简单的方法,就是将每个数都记录一遍,然后再次遍历,要是发现某个数只出现了一次,那么他就是最后的答案。
要是数据范围小的话,可以直接用数组,要是大,可以考虑用HashMap
但是,你不觉得这种方法很蠢吗,又耗时间又耗空间
当我们看到:都是非空整数、出现两次的时候
我们应该想到异或的两个性质:
- 两个相同的数进行异或,结果为0
- 0与任何一个数异或,结果都是那一个数
所以这个题目我们使用异或来求解是最方便的
- 一次遍历
- 简洁的代码
三、AC 代码:
class Solution {
public int singleNumber(int[] nums) {
int num=0;
for (int i = 0; i < nums.length; i++) {
num = num ^ nums[i];
}
return num;
}
}
四、总结:
相同的数,用异或或变成0
然后这个数和另一个数做异或,就还是这个数
根据结合律,a^(a^c) = (a^a)^c,所以不断地做异或,最后的一定是只出现过一次的那个数字
参考
只出现一次的数字(C++ 「1个数/2个数」同类题一网打尽)