[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?

Single number 的扩展题~除了一个元素,其他元素都出现了3次,找到那个元素~ 如果每个元素都出现了3次,那么每一个bit上出现1的次数也就是3的倍数,可以把数组的数都按位相加,然后对每一位都取余3,那么结果就是那个要找的数~值得注意的是,用python写的话要注意处理负数的情况(用c++或java写的话不用处理,直接返回就行)~刚开始不明白为什么用python写还要处理负数的情况,后来问了某人,貌似是因为python中没有数值溢出的概念,如果超出int的范围会自动扩充到long, 还不是很确定,以后弄清楚了再补充吧~

class Solution:
    # @param A, a list of integer
    # @return an integer
    def singleNumber(self, A):
        if A is None: return None
        count = [0] * 32
        for i in xrange(32):
            for num in A:
                count[i] += (num >> i) & 1
        res = 0
        for i in xrange(32):
            res += (count[i] % 3) << i
        if count[-1] % 3 == 1:
        # manually revert the thing: -i = (~i) + 1 or ~(i - 1)
            res = -(res - 1 ^ (1 << 32) - 1)
        return res

写这题之前对二进制的补码概念一直还比较模糊,所以加一点概念知识在这里~

原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。
反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
正零和负零的补码相同,[+0]补=[-0]补=0000 0000B
从补码求原码的方法跟原码求补码是一样的 ,也可以通过完全逆运算来做,先减一,再取反 

ps: python中运算符优先级:从最低的优先级到最高的优先级~(二进制运算优先级:取反运算符  左移运算符  右移运算符  按位与运算符  按位异或运算符  按位或运算符)

运算符 描述
lambdaLambda表达式
or布尔“或”
and布尔“与”
not x布尔“非”
in,not in成员测试
is,is not同一性测试
<,<=,>,>=,!=,==比较
|按位或
^按位异或
&按位与
<<,>>移位
+,-加法与减法
*,/,%乘法、除法与取余
+x,-x正负号
~x按位翻转
**指数
x.attribute属性参考
x[index]下标
x[index:index]寻址段
f(arguments...)函数调用
(experession,...)绑定或元组显示
[expression,...]列表显示
{key:datum,...}字典显示
'expression,...'字符串转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值