class Solution {
public int singleNumber(int[] nums) {
//相同数字,每个位上的元素都是一样的,所以统计数字对3取余就可以了。
int res = 0;
int m = 1;
for(int i = 0; i < 32; i++){
int sum = 0;
for(int j = 0; j < nums.length; j++){
if((nums[j] & m) != 0){
sum++;
}
}
res = res + m * (sum % 3);
m = m << 1;
}
return res;
}
}
def singleNumber(nums):
m = 1
res = 0
for bit in range(32):
bit_res = 0
# 得到所有元素这一位数字的和
for _ in nums:
# 说明这一位上的数为1,如果这一位的数为0,&的结果就是0
if _ & m != 0:
bit_res += 1
# 直接将这一位转换为十进制
res = res + m*(bit_res % 3)
m = m << 1
return res
class Solution {
public int singleNumber(int[] nums) {
int[] cnt = new int[32];
for (int num : nums) {
for (int i = 0; i < 32; i++) {
cnt[i] += (num & 1);
num >>= 1;
}
}
int ans = 0;
for (int i = 31; i >= 0; i--) {
ans <<= 1;
if (cnt[i] % 3 != 0) ans++;
}
return ans;
}
}
func singleNumber(nums []int) int {
//哈希表计算个数
num := map[int] int{}
for _, vlaue := range nums{
num[vlaue]++ //统计个数
}
//重新遍历找到只出现一次的那个数返回
for key, value := range num{
if value == 1{
return key
}
}
return 0
}
func singleNumber(nums []int) int {
var count [32]int
res := 0
for i := 0; i < 32; i++ {
count[i] = 0
}
m := 1
for i := 0; i < 32; i++ {
for j := 0; j < len(nums); j++ {
//不能用==1的原因是,当m左移之后与运算的结果就不是1了
if nums[j] & m != 0 {
count[i]++
}
}
count[i] %= 3
res += count[i] * m
m <<= 1
}
return res
}
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# 位运算
temp = 1
res = [0 for i in range(32)]
sum = 0
for i in range(32):
for j in nums:
# 将所有元素表示程二进制之后,每个位的值{0,1}相加,
if j & temp != 0:
res[i] += 1
# 再除3取余(%),为0表示出现一次对应位置为0,为1表示对应位置为1
res[i] %= 3
# 将结果转为10进制
sum += res[i] * temp
# temp左移一位
temp <<= 1
return sum
class Solution {
public int singleNumber(int[] nums) {
int[] bit = new int[32];
int res = 0;
int tag = 1;
for (int i = 0; i < 32; i ++) {
for (int j = 0; j < nums.length; j ++) {
if ((tag & nums[j]) != 0) {
bit[i] ++;
}
}
bit[i] %= 3;
res = res + bit[i] * tag;
tag = tag << 1;
}
return res;
}
}
class Solution {
public int singleNumber(int[] nums) {
//位运算;出现次数最少的
int [] num = new int[32];
int m = 1;
int sum = 0;
//这里的i是说明int 类型的数值是32位,从而在做与运算的时候像下一位移动
for (int i = 0;i <32;i++){
for (int j = 0;j<nums.length;j++){
if((nums[j] & m) != 0){
num[i]++;
}
}
//取模,数组中有数据出现了三次
num[i] = num[i]%3;
//求出这个数据的十进制
sum=sum+ num[i]*m;
m = m<<1;
}
return sum;
}
}
class Solution {
//时间复杂度O(n)
//空间复杂度O(1)
public int singleNumber(int[] nums) {
//找到求得二进制数上的每一位,对3取余然后把每一位组合起来最终形成只出现一次的数
int[] num = new int[32];
int a = 1;
int value = 0;
for (int i = 0; i < 32; i++) {
for (int j = 0; j < nums.length; j++) {
if((nums[j] & a) != 0){
num[i]++;
}
}
//因为除了目的数其他数都为三个,确定这一位上有没有该数
int tem = num[i] % 3;
//累加得到数
value += tem * a;
a <<= 1;
}
return value;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] t = new int[32];
int m = 1;
int sum = 0;
for(int i = 0; i < 32; i++) {
for(int j = 0; j < nums.length; j++) {
if((nums[j] & m) != 0) {
t[i]++;
}
}
t[i] %= 3;
sum += t[i]*m;
m <<= 1;
}
return sum;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] res= new int[32];
int m = 1;
int sum = 0;
for(int i=0;i<32;i++){
for(int j =0;j<nums.length;j++){
if((nums[j]&m) != 0){
res[i]++;
}
}
res[i] = res[i]%3;
sum = sum+res[i]*m;
m = m<<1;
}
return sum;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] res = new int[32];
int m = 1;
int sum = 0;
for(int i = 0;i < 32;i++){
for(int j = 0;j < nums.length;j++){
if((nums[j] & m) != 0){
res[i]++;
}
}
res[i] = res[i] % 3;
sum = sum + res[i]*m;
m = m << 1;
}
return sum;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] count = new int[32];//\记录所有数字的各二进制位的 1 的出现次数
for(int n : nums){ //循环遍历数组
for(int i = 0;i<32;i++){
count[i] = count[i]+(n & 1); //更新数组i位 (n+1)可得到最右一位的数
n = n>>1; //i位->i+1位
}
}
int res = 0,m = 3; //m是出现次数,res是结果
for(int i = 0;i<32;i++){
res = res<<1; //左移,为了恢复到10进制
res = res | count[31-i]%m; //得到右侧一位数该是多少
}
return res;
}
}
class Solution {
public int singleNumber(int[] nums) {
int[] res = new int[32];
int m = 1;
int sum = 0;
for (int i = 0; i < 32; i++) {
for (int j = 0; j < nums.length; j++) {
if ((nums[j] & m) != 0) {
res[i]++;
}
}
res[i] %= 3;
sum = sum + res[i] * m;
m = m << 1;
}
return sum;
}
}
class Solution:
def singleNumber(self, nums: List[int]) -> int:
bits=[0]*32
for x in nums:
for i in range(0,32,1):
bits[i]=bits[i]+(x&1)
x=x>>1
num=0
for i in range(31,-1,-1):
num=(num<<1)|(bits[i]%3)
if bits[31]==0:
return num
else:
return ~(num ^ 0xffffffff) # 为什么这里是这样求得,没想明白
共以下 26 个回答
位运算解决
哈希
时间O(n) 空间O(1)
时间复杂度:O(n)
空间复杂度:O(1)
思路一:如果一个数出现了三次,那么各个二进制位出现的次数都是3的倍数。只需统计每一个二进制位上出现的次数,对3取余,然后将剩下的求和就是只出现一次的数。时间复杂度O(32 * N),空间复杂度O(1)。
思路二: 用一个哈希表存储<数字,次数>。时间复杂度O(N),空间复杂度O(N)。
我是傻子
想不到
脑袋只剩下统计了,位运算这个实在是想不到,时间复杂度O(n)空间复杂度O(1)
妙哉
时间复杂度O(n)
空间复杂度O(1)
时间复杂度O(N),空间复杂度为O(1)
时间复杂度为O(n),空间复杂度为O(1)
//bit运算& nums) {
class Solution {
public:
int singleNumber(vector
int res[32]={0};
for(int cur:nums){
for(int i=0;i<32;++i){
if((cur&(1<<i))) res[i]++;
}
}
for(int i=0;i<32;++i) res[i]%=3;
int ret=0;
for(int i=0;i<32;++i){
if(res[i]) ret+=(1<<i);
}
return ret;
}
};
时间O(n)
空间O(1)
时间:O(n),空间:O(1)
时间复杂度O(N)空间复杂度O(1)
统计+重组数字,这种解法适用于任何“其他数字出现m次,其中一个只出现1次的题目”吗,但是个人感觉需要注意int有的机器上不止32位
最后一个python为什么这样求负数没想明白