136-只出现一次的数字
# 描述
难度:简单
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/single-number 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# 思路
LeetCode入门最简单,也是最经典的题目之一,解决方法会有很多。
我觉得这道题最重要的掌握不同的方法,发散思维,然后明白时间复杂度、空间复杂度如何计算,所以入门算法的筒子们,可以看看这道题,慢慢琢磨。
# 方法一:暴力循环
两次循环,先指定第1个数,然后再遍历整个数组,如果没找到除了自己的数之外,就返回该数据。
但是时间复杂度高。
* 时间复杂度:O(n^2)
* 空间复杂度:O(1)
# 方法二:hashSet
既然这样,最容易想到的方法就是把所有的元素放到hashSet里面,全部add进去,然后add返回false的时候(证明已经add过了,表示出现了两次)再remove一次,最后hashSet里面就是只出现一次的数了。
* 时间复杂度:O(n)
* 空间复杂度:O(n)
虽然时间复杂度降下来了,却需要用到额外的空间。
# 方法三:先排序再比较
把数组全部排序后,再比较,n和n+1的元素,如果不相等,表示 n 就是只出现一次的元素了。
* 时间复杂度:O(n) 要看排序方法
* 空间复杂度:O(1)
# 方法四:异或
异或 ^,相同 则为 0,不相同 则为1。所以两个相同的数异或都会等于0,任何数和 0 异或,都是等于本身。所以只要把数组所有的数进行异或,得到的就会是只出现一次的元素。
* 时间复杂度:O(n)
* 空间复杂度:O(1)
# 题解
public class 只出现一次的数字136 {
public static void main(String[] args) {
// int[] nums = new int[]{2, 2, 1};
int[] nums = new int[]{4, 1, 2, 1, 2};
System.out.println(singleNumber1(nums));
System.out.println(singleNumber2(nums));
}
/**
* 暴力循环
* 时间复杂度:O(n^2)
* 空间复杂度:O(n)
*/
static int singleNumber1(int[] nums) {
for (int i = 0; i < nums.length; i++) {
boolean flag = true;
for (int j = 0; j < nums.length; j++) {
if (nums[i] == nums[j] && i != j) {
flag = false;
break;
}
}
if (flag) {
return nums[i];
}
}
return -1;
}
/**
* hashSet
* 时间复杂度:O(n)
* 空间复杂度:O(n)
*/
public static int singleNumber2(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
// 尝试将当前元素加入 set
boolean flag = set.add(nums[i]); //false 表示无法add,即已存在
if (!flag) {
// 当前元已经存在于 set,即当前元素第二次出现,从 set 删除
set.remove(nums[i]);
}
}
// 最后只剩一个不重复的元素
return set.iterator().next();
}
/**
* 先排序再移位,
* 时间复杂度:O(n) 要看排序方法
* 空间复杂度:O(1)
*/
static int singleNumber3(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length; ) {
if (i + 1 < nums.length && (nums[i] == nums[i + 1])) { //如果是最后一位则不能i+1
i = i + 2;
} else {
return nums[i];
}
}
return -1;
}
/**
* 异或,任何和0异或的数,都是原来的数
* 时间复杂度:O(n)
* 空间复杂度:O(1)
*/
static int singleNumber4(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
上次更新: 2026-03-28 17:00:16