根据蓝桥云课--算法入门精品课学习笔记打卡
"""1-1000这1000个数放在含有1001个元素的数组中,只有唯一的
一个元素值重复,其它均只出现一次。每个数组元素只能访问一
次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一
个算法实现?
"""
#方法一:用异或消去重复
import random
arr=[]
for i in range(1,11): #生成十个不重复的元素
arr.append(i)
arr.append(random.randint(1,10)) #末尾多添加一个随机元素
i=random.randint(0,9)
arr[i],arr[10]=arr[10],arr[i] #将随机一个位置的元素和最后一个换位置,打乱顺序
print(arr)
temp=10
for i in range(1,10):
temp=temp^i #人为将1-10相异或并记录,用于后期测试消去重复的
for j in arr:
temp=temp^j #消去重复两次的,剩下的重复了三次,就是我们所需的
print(temp)
print("=================")
#方法二:有意义的数组下标
#需要使用辅助空间,不符合题目要求,仅作为一种思路
print(arr)
helpArr=[]
for i in range(0,11): #创建一个数组,下标是0-10,全部初始化为0,但是下标为0的不使用
helpArr.append(0)
for i in arr:
helpArr[i]+=1 #数组下标是有意义的,下标为几,代表其存的是该数字出现的次数
print(helpArr)
for i in range(1,11): #找到那个元素的为2的下标,即可知是几出现了两次
if helpArr[i]==2:
print(i)
print("================")
#方法三:超级暴力,时间复杂度高,但每个元素也不止遍历了一遍,也不符合题目要求
print(arr)
for i in range(0,11):
for j in range(i+1,11):
if arr[i]==arr[j]:
print(arr[i])
"""请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
例: 9的二进制表示为1001,有2位是1
""" #整数是32位,最高有效位前面都是0,如果用循环做,则循环次数是32
#方法一:不断对2求余后除2,相当于去掉二进制的最后一位,直到为0
x=int(input("请输入一个整数"))
Reminder=0 #记录二进制的最后一位
while x!=0:
Reminder+=x%2
x//=2 #必须是//=而不是//,//只是返回一个值,并不会更新x的值,会进入死循环
print(Reminder)
#方法二:将1不断与每一位相与,可以与完之后把一左移一位,也可以与完之后把这个数整体右移一位
print("================================")
x=int(input("请输入一个整数"))
count1=0
temp=1
for i in range(32):
if (x&temp)==temp:
count1+=1
temp=temp<<1
print(count1)
#方法三:神之一笔!用x&(x-1)就可以消掉最低的一个1,因为如果低位是0不够减,需要借位,借位就会导致如101000变成100111
#这两相与之后,得到100000,刚好消去了最低位的一个1
print("=================================")
x=int(input("请输入一个整数"))
count2=0
while(x!=0):
x=x&(x-1)
count2+=1
print(count2)
"""用一条语句判断一个整数是不是2的整数次方。
"""
N=int(input("请输入一个整数"))
print("是的") if N&(N-1)==0 else print("不是")
#exp1 if contion else exp2;三目运算符语法
""""将整数的奇偶位互换,第一位和第二位换、第三位和第四位换......"""
#方法一:将一个整数换为二进制,再转化成字符,再变成数组,用循环来交换
N=int(input("请输入一个整数"))
n=bin(N).replace('0b','') #转化成二进制,使用bin函数,并去掉开头的0b
n=list(n) #将这个二进制转成数组
print(n)
for i in range(32-len(n)): #整数一共三十二位,前面补0
n.insert(0,'0')
for i in range(0,32,2): #奇偶位互换
n[i],n[i+1]=n[i+1],n[i]
print(n)
print('0b',end="") #输出时再把0b加上
temp=0
for i in range(32):
if n[i]!='0': #找到第一位不是0的,在此之后都可以直接输出
temp=1
if temp==1:
print(int(n[i]),end="")
print("\n=====================================]")
#方法二:用或运算,把奇数位设置成1,偶数位设置成0,与原数相或,得到的
#就全是奇数位了,偶数位就都是0了,然后左移一位;而偶数位也同理处理,
#最后又移一位,最后一起异或,就得到了
ji=N&0x5555 #相当于N与0101010101010101相与
ou=N&0xaaaa
output=(ji<<1)+(ou>>1) #感觉加法或者异或应该都可以,把奇数位左移,偶数位右移
print(output)