Python刷题位运算,搞懂原理再来做

一、
吾不知语何,见题乎,泪也!
二、题目解析
1.整数替换(397)难度:中等

class Solution:
	def intgerReplacement(self,n:int)->int:
		count=0
		while n!=1:
			if n%2==0:
				n=n//2
			else:
				if n!=3 and (n>>1)&1==1:
					n=n+1
				else:
					n=n-1
			count+=1
		return count

这道题目采用了贪心的思想,同时包含了一些位运算的内容;
我们可以从二进制的角度进行分析:给定起始值 n,求解将其变为 (000…0001)2的最小步数。
对于偶数(二进制最低位为 00)而言,我们只能进行一种操作,其作用是将当前值x其进行一个单位的右移;
对于奇数(二进制最低位为 11)而言,我们能够进行 +1 或 -1 操作,分析两种操作为 x产生的影响:
对于 +1 操作而言:最低位必然为1,此时如果次低位为0的话,+1 相当于将最低位和次低位交换;如果次低位为1的话,+1 操作将将「从最低位开始,连续一段的1进行消除(置零),并在连续一段的高一位添加一个1;
对于 -1 操作而言:最低位必然为1,其作用是将最低位的 1进行消除。
因此,对于x为奇数所能执行的两种操作,+1 能够消除连续一段的 11,只要次低位为 1(存在连续段),应当优先使用 +1 操作,但需要注意边界 x = 3时的情况(此时选择 -1 操作)。

2.将二进制表示减到1的步骤数(1404)难度:中等
这里先放一个将二进制数转换为十进制数的解法在这里插入图片描述
二进制的方法暂时不熟练,还没有想出来解题的方法,有想法的可以分享一下。
3.数字范围按位与(201)难度:中等

今天的刷题就先到这里了,之所以每天不管怎样都要刷几道,也是为了坚持这个习惯;不过今天的题目确实出于能力有限,可以基本理解意思,但还不会用这个知识去解题,题目的解答也是参考了别人的代码,勉强可以看懂,但是自己写的话可能还是写不出来;
看来还是任重道远,同志仍需努力呀!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUSE_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值