一、
吾不知语何,见题乎,泪也!
二、题目解析
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)难度:中等
今天的刷题就先到这里了,之所以每天不管怎样都要刷几道,也是为了坚持这个习惯;不过今天的题目确实出于能力有限,可以基本理解意思,但还不会用这个知识去解题,题目的解答也是参考了别人的代码,勉强可以看懂,但是自己写的话可能还是写不出来;
看来还是任重道远,同志仍需努力呀!!!