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

相关推荐
努力学习的小廉4 分钟前
深入了解linux系统—— 线程同步
linux·服务器·数据库·算法
数据爬坡ing7 分钟前
从挑西瓜到树回归:用生活智慧理解机器学习算法
数据结构·深度学习·算法·决策树·机器学习
ytadpole8 分钟前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
luoganttcc8 分钟前
小鹏汽车 vla 算法最新进展和模型结构细节
人工智能·算法·汽车
用户37215742613513 分钟前
Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
java
叫我阿柒啊41 分钟前
Java全栈开发实战:从基础到微服务的深度解析
java·微服务·kafka·vue3·springboot·jwt·前端开发
凯尔萨厮1 小时前
Java学习笔记三(封装)
java·笔记·学习
霸道流氓气质1 小时前
Java开发中常用CollectionUtils方式,以及Spring中CollectionUtils常用方法示例
java·spring
失散131 小时前
分布式专题——5 大厂Redis高并发缓存架构实战与性能优化
java·redis·分布式·缓存·架构
通达的K1 小时前
Java实战项目演示代码及流的使用
java·开发语言·windows