LeetCode——single-number&single-number-ii
Posted xym4869
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——single-number&single-number-ii相关的知识,希望对你有一定的参考价值。
Q:现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现两次。你需要找出只出现一次的元素
注意:你需要给出一个线性时间复杂度的算法,你能在不使用额外内存空间的情况下解决这个问题么?
A:
这个题目可以参考 https://www.cnblogs.com/xym4869/p/12331907.html
1.如果可以使用额外的内存空间,可以使用set,set不能添加同一个key两次,如果重复了,set.add返回false
2.所有值异或,相同值异或为0,最后剩下的就是唯一的不同元素。
public static int singleNumber(int[] A) {
int num = 0;
for(int i=0;i<A.length;i++){
num^=A[i];
}
return num;
}
Q:现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现三次。你需要找出只出现一次的元素
注意:
你需要给出一个线性时间复杂度的算法,你能在不使用额外内存空间的情况下解决这个问题么?
A:
若一个数出现三次,则其对应的二进制数每一位相加必为3或0。
统计数组中所有元素的每一位,若为3的倍数,所求数的该二进制位对3取余为0,否则为1。
举例:{1,1,1,2,2,2,3}
01
01
01
10
10
10
11
--
04%3 = 01
40%3 = 10
--
11
public int singleNumber(int[] A) {
int result = 0;
for (int i = 0; i < 32; ++i) {
int bits = 0;
for (int value : A) {
bits += (value >> i) & 1;//依次获取A中每个元素的第i位,全部和1与后相加
}
//这里的|=和+=是一样的,因为当前只会得到在i为为0或1,右侧位全为0的值和i位为0但右侧不一定完全为0的值的和,用或和加都行,但用或会更快
result |= (bits % 3) << i;
}
return result;
}
这个题还有种解法,可看 https://www.jianshu.com/p/c8612aef41af
但实在太难了,没看懂。
以上是关于LeetCode——single-number&single-number-ii的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode——single-number&single-number-ii
java 来自https://leetcode.com/problems/single-number/#/description
java 来自https://leetcode.com/problems/single-number/#/description