华为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在线答疑。

相关推荐
OPEN-F14 分钟前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791314 分钟前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
奇牙coding26 分钟前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
tomwang032231 分钟前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!32 分钟前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
Lhappy嘻嘻39 分钟前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
黄俊懿39 分钟前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
Rain的Java大神之路1 小时前
别再死磕 MySQL 了:向量数据库与 RAG 生产落地实录(Java 工程师专场)
java·后端·面试
七夜zippoe1 小时前
Spring AI 是什么?Java 工程师的 AI 开发第一站
java·人工智能·spring·ai·开发
2501_926978331 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作