python x 0b1011_Python刷题:集合S(k)求|x-y|最小时的x和y(二进制)

题型叙述

针对64位或32位系统的无标记整数x,我们在它的二进制表明中,把1的数量称之为x的权重。比如x=7,它的二进制表明为0b111,因为有3个1,因此 x的权重便是3。用S(k)表明64位或32位系统整数中,权重为k的全部整数的结合,在其中k并不等于0、32、64。现给出一个整数x,假定它归属于结合S(k),规定找到另一个归属于S(k)的整数y,促使|x-y|的值最少。

解题思路

答题方式:能够先应用穷举法,使k相当于一个较小的数,例如k=3,假定x=0b1011,随后例举一些一样k=3的数据做为y,能够发觉|x-y|最钟头的y=0b1101,能够再假定x为别的一些值,并找到相匹配的|x-y|最钟头的y,能够发觉那样一个简易的规律性:x相匹配的y实际上便是在x的二进制表明中从右往左解析xml,寻找2个值不一样的比特位,随后互换这两个比特位的值就获得了y的二进制表明。

思索:因为这一规律性仅仅根据简易的好多个事例得到,不一定确保是恰当的答题方式,因此 能够再思索一下这一方式的可行性分析:要想两个数的差的平方根最少,就必须这两个数尽量相仿,即二进制位上每个部位上的值要尽量同样,而又因为必须权重同样,因此 只有将在其中一个0变成1,另一个1变成0,将要x中的在其中一组0和1开展互换,而那样转换以后的做差实际操作,要想2个值的误差最少,互换的这两个部位就务必尽量相仿且应当是以最少位开始查找,而最相仿的2个0和1毫无疑问便是邻近的0和1了。

答题编码

def func(x):

"""假定x为64位整数"""

# 从底位向上位扫描仪

for i in range(64):

# 找到邻近的一组0和1的部位

if ((x >> i) & 1) != ((x >> (i 1)) & 1):

# 互换2个部位的值

return x ^ ((1 << i) | (1 << (i 1)))

print(bin(func(0b1011))) # 輸出: 0b1101

汇总

像这种题型,仅是凭想像短期内是不太想找出规律的,因此 能够先应用穷举法根据一些简易的事例看一下是不是能找出规律,寻找规律性后必须再思索下这一规律性是不是考虑题型的规定,自然假如時间急迫能够先写成优化算法,后边有时间再说健全和认证优化算法的准确性。互换x中特定2个部位i和j的比特位应用公式计算x ^ ((1 << i) | (1 << j))就可以。

题型及答题优化算法来源于:书本《Python程序员面试宝典》。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值