华为OD机试 - 小扇和小船的数字游戏 - 二进制(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

小扇和小船今天又玩起来了数字游戏,小船给小扇一个正整数 n(1 ≤ n ≤ 1e9),小扇需要找到一个比 n 大的数字 m,使得 m 和 n 对应的二进制中 1 的个数要相同,如:

4对应二进制100

8对应二进制1000

其中1的个数都为1个

现在求 m 的最小值。

二、输入描述

输入一个正整数 n

三、输出描述

输出一个正整数 m

1、输入

2

2、输出

4

3、说明

2的二进制10,

4的二进制位100,

1的个数相同,且4是满足条件的最小数

四、解题思路

本题要求找到一个比给定数字 n 大的最小数字 m,使得 n 和 m 的二进制表示中含有相同数量的1。这是一个典型的位操作问题,涉及到二进制的一些性质。

1、关键思路概述:

  1. 二进制表示:任何数 n 的二进制表示中,要找到下一个有相同数量的1的数,我们需要在最低位的0后面的最低位的1进行操作。
  2. 右侧交换法则:找到右侧的第一个0,位于第一个1的左边,将这个0变成1(提升这个位),并将这个1变成0(下移这个位)。
  3. 调整尾部1:为了得到最小的数,将所有低于已交换的1的位重置,使得所有1尽可能靠右。

2、具体实现可以通过以下步骤:

  1. 寻找第一个形如 01 的位模式,即一个1的右侧直接跟着一个0。
  2. 将这个模式转换为 10,即把0改成1,1改成0。
  3. 重新排列所有右侧的位,使所有1尽可能靠右(即后面的位)。

五、Java算法源码

java 复制代码
public class OdTest01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 从输入读取一个整数 n
        int m = nextHigherNumber(n);  // 调用方法计算满足条件的最小 m
        System.out.println(m);  // 输出结果 m
    }

    private static int nextHigherNumber(int n) {
        // c 是将 n 的最低位的1及其后面的0进行翻转后的结果
        int c = n;
        int c0 = 0;  // 用于计数从最低位到第一个1左侧的0的个数
        int c1 = 0;  // 用于计数第一个1及其右侧的1的个数

        // 计数 n 最右边的 0 的个数(在第一个 1 的左边)
        while (((c & 1) == 0) && (c != 0)) {
            c0++;
            c >>= 1;
        }

        // 计数 n 中第一个1右侧的1的个数
        while ((c & 1) == 1) {
            c1++;
            c >>= 1;
        }

        // 如果所有的1都在最高位或者n为0
        if (c0 + c1 == 31 || c0 + c1 == 0) {
            return -1;  // 没有更高的数
        }

        // 最右侧非末尾0的位置
        int pos = c0 + c1;

        // 翻转最右侧的非末尾0(使之成为1)
        n |= (1 << pos);
        // 清除pos位右侧的所有位
        n &= ~((1 << pos) - 1);
        // 在右侧插入 (c1-1) 个1
        n |= (1 << (c1 - 1)) - 1;

        return n;
    }
}

六、效果展示

1、输入

7

2、输出

11

3、说明

🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
皮皮林5516 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河6 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
地平线开发者7 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮7 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者8 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考8 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
桦说编程9 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅11 小时前
Java面向对象入门(类与对象,新手秒懂)
java
HXhlx11 小时前
CART决策树基本原理
算法·机器学习