【LeetCode】Single Number II

题目

Given an array of integers, every element appears three times except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

解答

1.通用解法,适合出现k次的
//int型数据为32位,可以开一个大小为32的int型数组存储N个元素的各个二进制位的1出现的次数,然后将该次数模3,
//若为1,则说明该位为所找元素二进制的对应那位,用一个初始为零的ret与找出的位作或运算,最终得到要找的数ret

public class Solution {
    public int singleNumber(int[] A) {
        int[] bit=new int[32];
        int ret=0;
        for(int i=0;i<32;i++){
            for(int j=0;j<A.length;j++){
                bit[i]+=(A[j]>>i)&1;
            }
            ret|=(bit[i]%3)<<i;
        }
        return ret;
    }
}

2.更快的解法,用3个int代表3个32位的数组,one表示出现1次的位,two表示出现2次的位,three表示出现3次的位
//(然后消除所有出现3次的位)

int singleNumber(int[] A){
	int one=0,two=0,three=0;
	for(int i=0;i<A.length;i++){
		two|=one&A[i];
		one^=A[i];
		three=one&two;
		one&=~three;
		two&=~three;
	}
	return one;
}

---EOF---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值