LeetCode每日一题:3133 数组最后一个元素的最小值

题目

给你两个整数 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)

 总结

        今天的题相比于昨天的题简单一点,而且用字符串处理对固定位处理二进制文件还是比较省脑子的(就是时间复杂度有点高),一会儿看看能不能用处理一下这个题。做了两天二进制的题,感觉这些算法还是需要一点数学基础来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值