用PYTHON学算法DAY2--位运算相关

本文介绍了如何使用Python实现将0到1之间的浮点数转换为二进制表示,若无法精确表示则显示错误。同时,提供了两种方法解决数组中出现k次与仅出现一次的数的问题,包括乘二取余法和利用n进制加法的技巧。
摘要由CSDN通过智能技术生成

根据蓝桥云课--算法入门精品课学习笔记打卡day2

一、二进制表示浮点实数

"""给定一个介于0和1之间的实数,(如0.625),类型为float,
打印它的二进制表示(0.101),
因为小数点后的二进制分别表示0.5,0.25.0.125.....。
如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”
"""
#方法一:乘二取余
f=float(input("请输入一个介于0和1之间的浮点数"))
flist=[]                        #用于存储数据
count=0                         #记录循环次数
while(f!=0):                    #循环乘2挪整
    f*=2
    if f>=1:
        f-=1                    #挪掉整数
        flist.append(1)
    else:
        flist.append(0)
    count+=1
if count>=32:                   #次数过多则输出ERROR
    print("ERROR")
    SystemExit
else:
    print("0.",end="")          #end="",取消换行影响
    for i in flist:
        print(i,end="")

二、出现k次与出现一次

"""数组中只有一一个数出现了1次,K为用户输入
其他的数都出现了k次,请输出只出现了1次的数。
"""
#方法一:利用n个相同的n进制数做不进位加法,结果是0,而且每一位都是0;
def find_single_occurrence(arr, k):
    result = 0
    for i in range(32):              # 假设数字是32位的整数,遍历每一位
        count = 0                    # 统计所有数字在当前位上的和
        for num in arr:
            count += (num >> i) & 1  # 取出当前位的值,与1相与,实际上是
                                     # 排除其他位的干扰,这样就只有最低位起作用
        result |= (count % k) << i   # 取余得到只出现一次的数字在当前位上的值
                                     # 并且还直接或运算,变成了十进制
    return result
arr1 = [1, 1, 2, 3, 3, 2, 5]
k1 = 2
result = find_single_occurrence(arr1, k1)
print(result)
arr2=[1,1,1,9,9,9,8,5,5,5,6,6,6,2,2,2]
k2=3
result=find_single_occurrence(arr2,k2)
print(result)

print("========================================")
#方法二,暴力循环,利用辅助空间,找到出现次数为1的;用这个方法,题目不给k也能做
helpArr=[0]*100                      #创建一个辅助空间,其值是该下标的数字出现的次数,可以为100,也可以为更大的数
#helpArr=[0 for i in range(100)]      与上一行殊途同归
for i in arr2:
    helpArr[i]+=1                    #下标是有意义的,代表的该数,而值代表其出现的次数
count=0                              #记录循环次数,也就是helpArr的下标
for i in helpArr:
    if i==1:                         #该下标值出现了一次
        print(count)
        break
    count+=1                         #注意此处的缩进,不管执不执行if,都要+1

print("===========================")
#方法三:用异或消去重复;这个我没做出来,可能只有当k是偶数才能用吧
ans=0
if k1%2==0:
    for i in arr1:
        ans=ans^i                    #数组中的每一个都相异或,偶数个的就自然消掉成0了,剩下的就只出现了一次
    print(ans)

"""补充:
def int_to_base(num,base):                      #这个函数可以将任意正整数转化为任意进制的数
    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    result = ""
    while num > 0:
        num, remainder = divmod(num, base)      #divmod:Return the tuple (x//y, x%y).  Invariant: div*y + mod == x.
        result = digits[remainder] + result     #将余数对应的数字字符加到 result 变量的前面。这是因为每次得到的余数都应该成为
                                                #目标进制表示中的一位数字,而且是从低位到高位的顺序。
    return result
"""

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值