当前位置: 首页 > news >正文

(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; }
http://www.jsqmd.com/news/455389/

相关文章:

  • 深度解析:Flowable + Vue3 企业级流程架构设计——为什么 若依RuoYi Office 的 BPM 能真正落地?
  • 2026四川活动物料工厂推荐榜 环保合规服务优 - 资讯焦点
  • (200分)- 找到比自己强的人数(Java JS Python)
  • Qwen3-ASR-0.6B在智能汽车中的应用:多模态交互系统设计
  • RAG意图分类微调实战教程(非常详细):构建专属“前置路由”,从入门到精通,收藏这一篇就够了!
  • 付了GPT-5的钱,用的是开源模型
  • 高效安全的开源激活工具:轻松搞定Windows与Office授权难题
  • GoChatIAI -Go语言AI应用服务平台
  • Ansible+cpolar NAS 设备远程自动化管理,不再手动操作!
  • 【2026强制新规预警】:MCP系统OAuth接入失败率下降83%的5个关键配置项
  • Agentic RAG深度解析教程(非常详细):最新论文揭秘技术真相,从入门到精通,收藏这一篇就够了!
  • UnityLive2DExtractor:自动化资源提取赋能Live2D工作流的效率革命
  • PyTorch二分类实战:BCEWithLogitsLoss的3个常见坑与解决方案
  • 用Gazebo+ROS打造智能家居仿真环境:从建模到自动化启动全流程
  • RAG评估体系搭建教程(非常详细):RAGAS+LangFuse实战全解,从入门到精通,收藏这一篇就够了!
  • Java 17中5种高效复制List的方法对比(附性能测试)
  • LLM Prompt Cache深度解析(非常详细):从KV Cache原理到推理架构,从入门到精通,收藏这一篇就够了!
  • 小龙虾-热门论文抓取
  • 为什么你的Spring Cloud Function在Knative上冷启动翻倍?深度解析ClassLoader隔离与Native Image兼容性黑洞
  • 使用Qwen3-TTS-Tokenizer-12Hz和MATLAB进行语音信号分析研究
  • 快速原型设计:用快马AI构建轻量替代方案,验证卸载openclaw后的可行性
  • QwQ-32B开源模型落地:ollama支撑的轨道交通信号逻辑推理
  • 2026广东浴室柜厂家优质推荐榜 - 资讯焦点
  • 开源工具RPFM全流程指南:从入门到精通Total War MOD开发
  • 慢阻肺长期气短、易感冒?2026 温和调理产品榜单,养无极补肺丸排第一 - 资讯焦点
  • 不用Root!这些隐藏代码能一键开启安卓诊断端口(小米/OPPO/魅族机型实测)
  • 效率倍增:使用快马平台快速开发AI测试数据生成器,解放双手
  • 中心拓展法求回文
  • 7个秘诀解锁Poppins字体的专业排版能力
  • 零基础玩转VRoidStudio汉化插件:从安装到个性化定制完全指南