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

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

一、唯一成对的数:

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










相关推荐

  1. PYTHON算法DAY1--运算相关

    2024-01-12 21:46:02       54 阅读
  2. 【C++】运算相关算法问题

    2024-01-12 21:46:02       28 阅读
  3. 【玩转python】入门篇day11-运算

    2024-01-12 21:46:02       23 阅读
  4. 1运算算法是什么、简单排序

    2024-01-12 21:46:02       59 阅读
  5. leetcode算法-运算

    2024-01-12 21:46:02       51 阅读
  6. 算法-运算

    2024-01-12 21:46:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-12 21:46:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-12 21:46:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-12 21:46:02       82 阅读
  4. Python语言-面向对象

    2024-01-12 21:46:02       91 阅读

热门阅读

  1. QT day5

    QT day5

    2024-01-12 21:46:02      55 阅读
  2. 用python实现把PDF转成图片,测试成功转化代码

    2024-01-12 21:46:02       43 阅读
  3. __declspec(dllexport)与__declspec(dllimport) 的区别

    2024-01-12 21:46:02       45 阅读
  4. C语言学习记录—进阶作业(通讯录静态版本)

    2024-01-12 21:46:02       54 阅读
  5. Netty Channel 详解

    2024-01-12 21:46:02       63 阅读
  6. 代码随想录算法训练营Day24|77. 组合

    2024-01-12 21:46:02       54 阅读
  7. ClickHouse中JOIN算法选择逻辑以及auto选项

    2024-01-12 21:46:02       47 阅读
  8. python之异常与日志

    2024-01-12 21:46:02       57 阅读
  9. 职工工作量统计(课程设计)

    2024-01-12 21:46:02       47 阅读
  10. Go语言中Print Printf Println的区别

    2024-01-12 21:46:02       54 阅读
  11. SQL语句

    SQL语句

    2024-01-12 21:46:02      52 阅读
  12. 在vue中使用v-for遍历arco.design图标

    2024-01-12 21:46:02       58 阅读
  13. ant-design-vue的table组件的自定义表头和表格内容

    2024-01-12 21:46:02       55 阅读