根据蓝桥云课--算法入门精品课学习笔记打卡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
"""