题目
给你两个整数
n
和x
。你需要构造一个长度为n
的 正整数 数组nums
,对于所有0 <= i < n - 1
,满足nums[i + 1]
大于nums[i]
,并且数组nums
中所有元素的按位AND
运算结果x
。返回
nums[n - 1]
可能的 最小 值。示例 1:
输入:n = 3, x = 4
输出:6
解释:
数组
nums
可以是[4,5,6]
,最后一个元素为6
。示例 2:
输入:n = 2, x = 7
输出:15
解释:
数组
nums
可以是[7,15]
,最后一个元素为15
。提示:
1 <= n, x <= 108
思路与代码
又是一个二进制位运算的题,反手一个暴力枚举发现超时了,结果一看n有10^8,还是要想一想其他的方法。要求位与运算结果为x,也就是说能在数组里面的数只需要满足x对应位上是1就行,其他位置1和0均可。
所以只要除去1的位置后,在原有的X里面0的位置上依次填充0和1就可以了,填充n次就行,这样子只需要把n-1对应的二进制表述插入在原有的X里面0位置上就行。
代码就很好写了,这里可以使用位运算的方法写,但其实主要过程就是对x里面特定位的改变,我就直接转化成字符串写代码了(顺便练一下py字符串相关的操作)。思路就是类似双指针的想法,从x和n的低位同时向高位移动,如果X为0(这一位可以插入)就把n这一位扔进去,X为1就把这一位设置为1,然后n的这一位就要填入下一位里,代码如下:
class Solution:
def minEnd(self, n: int, x: int) -> int:
# 转换成字符串开始做
nums_init=bin(n - 1)
x_init=bin(x)
res='' #res用来存放最终结果
while nums_init!='0b' and x_init!='0b':
# x为0,这一位直接插
if x_init[-1]=='0':
res+=nums_init[-1]
x_init=x_init[:-1]
nums_init=nums_init[:-1]
# x的这一位为1,结果的这一位得定为1,这里的n要留到下一位操作
else:
res+=x_init[-1]
x_init=x_init[:-1]
# 条件的处理
while x_init!='0b':
res+=x_init[-1]
x_init=x_init[:-1]
while nums_init!='0b':
res+=nums_init[-1]
nums_init=nums_init[:-1]
# 转int
res='0b'+res[::-1] # str的高位对应bin的低位要flip一下
return int(res,2)
总结
今天的题相比于昨天的题简单一点,而且用字符串处理对固定位处理二进制文件还是比较省脑子的(就是时间复杂度有点高),一会儿看看能不能用处理一下这个题。做了两天二进制的题,感觉这些算法还是需要一点数学基础来的。