【LeetCode】Single Number题解

【LeetCode】Single Number题解

Single Number I

原题链接:https://leetcode.com/problems/single-number/

这个题目的大意就是,在一个数组中只有一个数字出现一次,其他数字都出现了两次;

这题的解题思路比较简单,我们知道如果两个相同的数异或运算之后结果为0,也就是n^n=0,借助这个思路,我们就可以遍历数组,对每个数都进行一次异或运算,最后得到的结果就是那个出现一次的数字,看一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
public class Solution {
public int singleNumber(int[] nums){
if (nums == null){
return 0;
}
int sum = 0;
for (int i = 0; i < nums.length; i++){
sum ^= nums[i];
}
return sum;
}
}

时间复杂度:O(n)

空间复杂度:O(1)

Single Number II

原题链接:https://leetcode.com/problems/single-number-ii/

这题的大意就是,一个数组中只有一个数字出现一次,其他数组出现三次,这题是上一题的加强版,依然可以采用位运算的思路;因为这是一个int数组(long数组同理),我们可以算出每一位1出现的次数,然后对3取余,最后相加得到的结果就是出现一次的那个数字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Solution {
public int singleNumber(int[] nums) {
if (nums == null){
return 0;
}
int res = 0;
for (int i = 0; i < 32; i++){
int sum = 0;
for (int j = 0; j < nums.length; j++){
sum += (nums[j] >> i) & 1;
}
res += ((sum % 3) << i);
}
return res;
}
}

时间复杂度:O(n)

空间复杂度:O(1)

References

Single Number III

原题链接:https://leetcode.com/problems/single-number-iii/

题目大意:已知一个数组,其中有两个数字在这个数组中只出现一次,其他数字都出现了两次,找出这两个只出现一次的数字,可以通过创建一个HashSet,然后遍历数组,如果HashSet中存在该数字,则从HashSet中删除该数字,最后HashSet会剩下两个数字,这两个数字就是只出现一次的数字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Solution {
public int[] singleNumber(int[] nums) {
if (nums == null){
return null;
}
HashSet<Integer> hashSet = new HashSet<>(nums.length);
for (int num : nums) {
if (!hashSet.add(num)) {
hashSet.remove(num);
}
}
int[] re = new int[2];
int i = 0;
for (Integer integer : hashSet) {
re[i++] = integer;
}
return re;
}
}

时间复杂度:O(n)

空间复杂度:O(n)

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×