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

相关推荐
愤怒的代码8 分钟前
Spring Boot对访问密钥加解密——HMAC-SHA256
java·spring boot·后端
带多刺的玫瑰8 分钟前
Leecode刷题C语言之切蛋糕的最小总开销①
java·数据结构·算法
巫师不要去魔法部乱说19 分钟前
PyCharm专项训练5 最短路径算法
python·算法·pycharm
栗豆包24 分钟前
w118共享汽车管理系统
java·spring boot·后端·spring·tomcat·maven
夜半被帅醒30 分钟前
MySQL 数据库优化详解【Java数据库调优】
java·数据库·mysql
万亿少女的梦16836 分钟前
基于Spring Boot的网络购物商城的设计与实现
java·spring boot·后端
qystca1 小时前
洛谷 P11242 碧树 C语言
数据结构·算法
冠位观测者1 小时前
【Leetcode 热题 100】124. 二叉树中的最大路径和
数据结构·算法·leetcode
悲伤小伞1 小时前
C++_数据结构_详解二叉搜索树
c语言·数据结构·c++·笔记·算法
醒了就刷牙1 小时前
黑马Java面试教程_P9_MySQL
java·mysql·面试