《算法很美》第一章

1.位运算

  • &(与)、| (或)、^(异或)、~ (非/取反)
  • ">>“和”<<"运算符将二进制位进行右移或者左移操作
  • ">>>"运算符将用0填充高位; >>运算符用符号位填充高位,没有<<<运算符
  • 对于int型,1<<35与1<<3是相同 的,而左边的操作数是long型时需对右侧操作数模64
  • 与:都为1结果为1,或:有一个为1结果为1,异或:二者不同时结果为1
     

题1:找出唯一的数

1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

解题:

1.先排序,从左到右遍历进行异或运算,利用A^A=0,0^A=A的性质解题。A^A^A=A,A^A=0。

2.累加求和,最后减去递增序列和求出重复元素。

3.开一个辅助空间记录数据出现数量,遍历得到等于2的数解决。

import random

list1 = [ i for i in range(10)]
print(list1)
num = random.randint(0,9)
list1[1]=num

list1.sort()
print(list1)

temp=0
for i in range(len(list1)-1):
    temp=temp^i
for i in range(len(list1)-1):
    temp=temp^list1[i]
print(temp)

题2:找出落单的那个数(与题1类似)

一个数组里除了某一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。

题3:二进制中1的个数

请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。

例: 9的二进制表示为1001,有2位是1

解题:

1.(x-1)&x消掉最低位的1

2.比对每一位

3.转为二进制,用字符串的count计数方法

# 解法一
n=7
count = 0
while(n!=0):
    n=(n-1)&n
    count+=1
print(count)

# 解法二
n=7
count = 0
for i in range(32):
    if((n&1<

题4:是不是2的整数次方

 解题:即二进制中只有一个1

n=16
if(((n-1)&n)==0):
    print("Yes")
else:
    print("No")

题5:将整数的二进制奇偶位互换

解题:和1010与运算得到偶数位,和0101与运算得到奇数位,偶数位右移,奇数位左移,在异或操作便实现互换。

def m(i):
    ou = i&0xaaaaaaaa  # 和1010 1010 ...做与运算得到偶位
    ji = i&0x55555555  # 和0101 0101 ...做与运算得到奇位
    return (ou >> 1) ^ (ji << 1)  # 异或和或运算都可以

a = 6
print(m(a))

题6:0~1间浮点实数的二进制表示

给定一个介于0和1之间的实数, (如0.625) ,类型为double,打印它的二进制表示(0.101,因为小数点后的二进制分别表示0.5,0.25.0.12…)。

如果该数字无法精确地用32位以内的-进制表示,则打印“ERROR”

解题:小数×2,判断是否大于1,大于1则二进制取1并减1。

list1=[]
a = 0.625
while(a>0):
    a=a*2
    if(a>=1):
        list1.append('1')
        a=a-1
    else:
        list1.append('0')
if(len(list1)>32):
     print("error!")
print(''.join(list1))

题7:出现k次与出现1次

数组中只有-一个数出现了1次,其他的数都出现了k次,请输出只出现了1次的数。
2 个相同的2 进制数做不进位加法,结果为0
10个相同的10进制数做不进位加法,结果为0
k 个相同的k 进制数做不进位加法,结果为0

你可能感兴趣的:(蓝桥杯,python,蓝桥杯)