python02

位运算

笔记

1.基本和C++一样,然后有个思想,就是把数看成集合

a | (1<<i)  -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 从集合中删除
a & (1<<i)  -> 判断 i 是否属于该集合(零不属于,非零属于)

就看一下第一个,把(1<<i),a看成一个集合,|相当于是并集运算(对应位有1就变为1,跟两个集合中一个有,一个没有某个元素,并集就有这个元素对应)

a 补 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)

2.还有,负数的补码和负数的绝对值之和是256,这样就可以快速计算负数对应的补码的数值
3.Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,比如:print(bin(-3)) # -0b11
4.python自带高精度

练习题

leetcode 习题 136. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

尝试使用位运算解决此题。

题目说明:

"""
Input file
example1: [2,2,1]
example2: [4,1,2,1,2]

Output file
result1: 1
result2: 4
"""



class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        
     # your code here

解:

class Solution:
    def singleNumber(self, nums: list) ->int:
        i=list(set(nums))
        for j in i:
            nums.remove(j)
        for j in nums:
            i.remove(j)
        return i[0]

b=Solution()
a=input("请输入一列数")
a=a.strip('[')
a=a.strip(']')
c=a.split(',')
print(b.singleNumber(c))

结果:

请输入一列数[2,2,1]
1
请输入一列数[4,1,2,1,2]
4

分析,感觉做麻烦了,先是处理输入,去掉[ ], 然后对‘,’进行切片得到列表
调用函数,
然后函数的设计思路是先通过转化为set去重,再转化回来,然后将原来的列表除去去重后的列表(这样原列表中只有一个的数字就没了),然后再在去重的列表中除去处理后的原列表,就得到了结果

又想到一个方法:

class Solution:
    def singleNumber(self, nums: list) ->int:
        b=[]
        for i in nums:
            if i in b:
                b.remove(i)
            else :
                b.append(i)
        return b[0]

b=Solution()
a=input("请输入一列数")
a=a.strip('[')
a=a.strip(']')
c=a.split(',')
print(b.singleNumber(c))

就是改了一下函数的处理,先准备一个空列表b,然后对nums进行遍历,如果这个数在b有就删除b中的这个数,否则就添加,这样出现两次的最终就不会出现在b中,这时返回b[0]即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值