题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路
首先,从题目中获取到几个关键点:
- 非空、整数、数组
- 只有一个元素出现一次,其余都出现两次
- 要求算法具有线性时间复杂度,不使用额外空间
所以,这里我们这里要使用的是 int 类型,从第二个关键点我首先想到的是用 hash 表,最后可以直接筛选出出现次数只有一次的元素,但是第三个关键点要求空间复杂度是 O(1),那这个想法就只能 pass 掉了,那还能用什么方法呢(此处不考虑暴力破解)。
既然这里是整型的数组,那我们不妨考虑一下位运算,那既然是要找出只出现过一次的元素,那就很好想到了,异或操作在两个相同二进制数中进行之后,所有位都会变为 0,而异或完最后的结果,则是只出现过一次(没有元素可以与之异或抵消)的元素。
实现
public int singleNumber(int[] nums) {
int ans = nums[0];
if (nums.length > 1) {
for (int i = 1; i < nums.length; i++) {
ans = ans ^ nums[i];
}
}
return ans;
}
By the way
有问题?可以给我留言或私聊
有收获?那就顺手点个赞呗~
当然,也可以到我的公众号下「6曦轩」,
回复“学习”,即可领取一份
【Java工程师进阶架构师的视频教程】~
回复“面试”,可以获得:
【本人呕心沥血整理的 Java 面试题】
回复“MySQL脑图”,可以获得
【MySQL 知识点梳理高清脑图】
由于我咧,科班出身的程序员,php,Android以及硬件方面都做过,不过最后还是选择专注于做 Java,所以有啥问题可以到公众号提问讨论(技术情感倾诉都可以哈哈哈),看到的话会尽快回复,希望可以跟大家共同学习进步,关于服务端架构,Java 核心知识解析,职业生涯,面试总结等文章会不定期坚持推送输出,欢迎大家关注~~~