【LeetCode:3133】数组最后一个元素的最小值(Java)

题目链接

题目描述

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

求解思路

  • 数组中各项的值按&运算最后得到x,由于&运算两项都为1结果才是1,因此可以得出:数组nums中每一项的二进制位都包含x的二进制位(即x二进制位中取1的位置,任一数组元素在该位置都会取1)。
  • 因为数组nums递增,我们可以在x的二进制位为0的位置依次填入数字。例如第0项可以不做填入,第1项在最低为填入1。
  • 要找数组第n-1项的最小值,就相当于在x的0位置上填入n-1(如果0的位数不够就在前面补0)。
  • i表示x二进制表示的第i位,j表示n-1二进制表示的第j位。while循环直到把n-1全部填入为止。如果x的第i位为0,则将n-1的第j位填入。

实现代码

class Solution {
    public long minEnd(int n, int x) {
        --n; //填入的数值为n-1
        long ans = x;
        int i = 0, j = 0;
        while ((n >> j) > 0) {
        	// 如果x的第i位是0
            if ((ans >> i & 1) == 0) {
            	// 将n-1的第j位填入
                ans |= (long) (n >> j & 1) << i;
                j ++;
            }
            i ++;
        }
        return ans;
    }
}
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值