news 2026/10/30 17:25:47

(200分)- 找数字(Java JS Python C)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(200分)- 找数字(Java JS Python C)

(200分)- 找数字(Java & JS & Python & C)

题目描述

小扇和小船今天又玩起来了数字游戏,

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

4对应二进制100

8对应二进制1000

其中1的个数都为1个

现在求 m 的最小值。

输入描述

输入一个正整数 n(1 ≤ n ≤ 1e9)

输出描述

输出一个正整数 m

用例
输入2
输出4
说明

2的二进制10,

4的二进制位100,

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

输入7
输出11
说明

7的二进制111,

11的二进制位1011,

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

题目解析

我们可以通过以下例子来说明解题方法:

示例1: n:10010100 → m:10011000

示例2: n:11101001 → m:11101010

示例3: n:11100010 → m:11100100

从这些例子可以看出,要找到满足条件的m,只需将n的二进制串中从右往左找到的第一个"01"子串替换为"10"即可。这种方法能在不增加'1'数量的前提下,找到比n大的最小m。

特殊情况处理: 当n的二进制形式为全1或类似111111、10000时,直接在最高位前补0: n = 0111111 → m = 1011111 n = 010000 → m = 100000

需要注意的优化点: 直接替换"01"为"10"可能会影响后续位的值。例如: n = 10000111100 → 简单替换后: m = 10001011100 此时m并非最优解,因为进位会影响后续位。更优的解法应该是: m = 10001000111 即在完成替换后,将进位影响位后面的所有'1'移至最低位。

JS算法源码
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; // 输入输出处理 void (async function () { // 将整数n转为二进制字符串 const nBinStr = "0" + Number(await readline()).toString(2); const mBinCharArr = [...nBinStr]; let countOne = 0; for (let i = mBinCharArr.length - 2; i >= 0; i--) { if (mBinCharArr[i] == "0" && mBinCharArr[i + 1] == "1") { // 从右向左找到了第一组"01"子串,则替换为"10" mBinCharArr[i] = "1"; mBinCharArr[i + 1] = "0"; // 如果第一组"01"子串右边存在1 if (countOne > 0) { // 则将第一组"01"子串的右边部分的'1'要全部集中到尾部 for (let j = i + 2; j < mBinCharArr.length; j++) { if (j < mBinCharArr.length - countOne) { mBinCharArr[j] = "0"; } else { mBinCharArr[j] = "1"; } } } break; } if (mBinCharArr[i + 1] == "1") countOne++; // 记录第一组"01"子串右边1的个数 } console.log(parseInt(mBinCharArr.join(""), 2)); })();
Java算法源码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); // 将整数n转为二进制字符串 String nBinStr = "0" + Integer.toBinaryString(n); char[] mBinCharArr = nBinStr.toCharArray(); int countOne = 0; for (int i = mBinCharArr.length - 2; i >= 0; i--) { if (mBinCharArr[i] == '0' && mBinCharArr[i + 1] == '1') { // 从右向左找到了第一组"01"子串,则替换为"10" mBinCharArr[i] = '1'; mBinCharArr[i + 1] = '0'; // 如果第一组"01"子串右边存在1 if (countOne > 0) { // 则将第一组"01"子串的右边部分的'1'要全部集中到尾部 for (int j = i + 2; j < mBinCharArr.length; j++) { if (j < mBinCharArr.length - countOne) { mBinCharArr[j] = '0'; } else { mBinCharArr[j] = '1'; } } } break; } if (mBinCharArr[i + 1] == '1') countOne++; // 记录第一组"01"子串右边1的个数 } int m = Integer.parseInt(new String(mBinCharArr), 2); System.out.println(m); } }
Python算法源码
# 输入获取 nBinStr = bin(int(input())) mBinCharArr = list("0" + nBinStr[2:]) countOne = 0 for i in range(len(mBinCharArr) - 2, -1, -1): # 从右向左找到了第一组"01"子串,则替换为"10" if mBinCharArr[i] == '0' and mBinCharArr[i+1] == '1': mBinCharArr[i] = '1' mBinCharArr[i+1] = '0' # 如果第一组"01"子串右边存在1 if countOne > 0: # 则将第一组"01"子串的右边部分的'1'要全部集中到尾部 for j in range(i+2, len(mBinCharArr)): if j < len(mBinCharArr) - countOne: mBinCharArr[j] = '0' else: mBinCharArr[j] = '1' break # 记录第一组"01"子串右边1的个数 if mBinCharArr[i+1] == '1': countOne += 1 m = int("".join(mBinCharArr), 2) print(m)
C算法源码
#include <stdio.h> #include <string.h> #include <stdlib.h> void dec2bin(int num, char *s) { int i = 0; while (num > 0) { s[i++] = (char) (num % 2 + '0'); num /= 2; } // strrev(s); // 该函数只能在windows系统使用,OJ一般搭建在Linux系统上,因此无法使用该函数 int l = 0; int r = i - 1; while (l < r) { char tmp = s[l]; s[l] = s[r]; s[r] = tmp; l++; r--; } } int main() { int n; scanf("%d", &n); char nBinStr[1000] = {'\0'}; nBinStr[0] = '0'; dec2bin(n, nBinStr + 1); int len = (int) strlen(nBinStr); int countOne = 0; for (int i = len - 2; i >= 0; i--) { if (nBinStr[i] == '0' && nBinStr[i + 1] == '1') { // 从右向左找到了第一组"01"子串,则替换为"10" nBinStr[i] = '1'; nBinStr[i + 1] = '0'; // 如果第一组"01"子串右边存在1 if (countOne > 0) { // 则将第一组"01"子串的右边部分的'1'要全部集中到尾部 for (int j = i + 2; j < len; j++) { if (j < len - countOne) { nBinStr[j] = '0'; } else { nBinStr[j] = '1'; } } } break; } // 记录第一组"01"子串右边1的个数 if (nBinStr[i + 1] == '1') { countOne++; } } char *endptr; int m = strtol(nBinStr, &endptr, 2); printf("%d\n", m); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 11:34:15

C++音视频开发实战:基于WebRTC的AI辅助开发优化策略

最近在做一个实时视频通话项目&#xff0c;用到了WebRTC。说实话&#xff0c;直接上WebRTC&#xff0c;延迟和画质在复杂网络下总是不尽如人意。传统的优化手段&#xff0c;比如调整码率、前向纠错&#xff08;FEC&#xff09;&#xff0c;感觉已经摸到了天花板。于是我开始琢磨…

作者头像 李华
网站建设 2026/10/7 9:43:05

技术解析:Navicat试用期限制的深度解决方案

技术解析&#xff1a;Navicat试用期限制的深度解决方案 【免费下载链接】navicat_reset_mac navicat16 mac版无限重置试用期脚本 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 引言 Navicat作为一款功能强大的数据库管理工具&#xff0c;在开发者社…

作者头像 李华
网站建设 2026/10/10 12:45:03

HUNYUAN-MT模型在C语言开发文档翻译中的应用实践

HUNYUAN-MT模型在C语言开发文档翻译中的应用实践 对于很多C语言开发者来说&#xff0c;阅读英文的技术手册、库函数文档或者开源项目的README&#xff0c;常常是一件头疼的事情。你可能遇到过这样的情况&#xff1a;想用一个新的库&#xff0c;但官方文档全是英文&#xff0c;…

作者头像 李华
网站建设 2026/10/7 11:10:45

DeepSpeed-RewardModel-Qwen3 实战:从零构建奖励模型

一、前言&#xff1a;为什么需要Reward Model&#xff1f; 在大语言模型的对齐训练中&#xff0c;**Reward Model&#xff08;奖励模型&#xff09;**是RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff09;流程的核心组件。它扮演着"裁判"的角…

作者头像 李华
网站建设 2026/10/7 13:00:59

ai辅助开发:用快马智能调度与管理多个openclaw本地大模型

最近在折腾本地大模型&#xff0c;尤其是用OpenClaw来配置和管理多个模型。OpenClaw确实是个好工具&#xff0c;它帮我把那些庞大的模型文件、复杂的依赖和环境配置都搞定了&#xff0c;让模型能在本地顺畅跑起来。但问题来了&#xff0c;模型是准备好了&#xff0c;怎么用它们…

作者头像 李华