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

2 篇文章 0 订阅
1 篇文章 0 订阅

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

一、唯一成对的数:

"""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)










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值