找数字-算法

解法一、数位模拟

比n大的最小数就是n+1,当n+1时,以下几种情况会导致n中1的个数发生变化(或者不变)

1.n的低位连续1的个数count>1,如1011,10111,1111等,加1后使得n中1的个数减少count-1个

解决办法也很简单,加1后,将这count-1个1补到低位即可。

2.n的低位连续1的个数count=1,如101,01,10101等,加1后n中1的个数不变,答案就是n+1;

3.n的低位连续1的个数count=0,如100,1010,10等,加1后使得n中1的个数增加1.

解决办法:找到最低位的1,再找到离它最近的高位0,两者互换,再把高位0位置后面的1全部放到低位。

代码:

import java.util.*;
public class Main{public static void main(String[] args){Scanner in=new Scanner(System.in);int n=in.nextInt();// 1.求n的低位连续1的个数int count=get(n),ans=0;if(count==1){ans=n+1;}else if(count==0){int[] arr=toArray(n);int index=arr.length-1;while(index>=0&&arr[index]==0){// 1.找最低位1的位置indexindex--;}if(index==0){//只有一个1ans=(n<<1);}else{// 2.找到index前面高位的第一个0位int idx=index-1;while(idx>=0&&arr[idx]==1){idx--;}if(idx<0){//前面没0,左移1位,除了最高位,全部取反int base=0,len=arr.length;for(int i=0;i<len;i++){arr[i]=(arr[i]==0?1:0);base=(base<<1)|arr[i];}ans=((1<<len)|base);}else{//两处互换,idx后面的1全部放到低位arr[index]=0;arr[idx]=1;int base=1,i=idx+1,j=arr.length-1;while(i<j){if(arr[i]==1){if(arr[j]==0){arr[j]=1;arr[i]=0;i++;}j--;}else{i++;}}for(i=1;i<arr.length;i++){base=(base<<1)|arr[i];}ans=base;}}}else{//加1,末尾补偿count-1个连续的1int digit=1;for(int i=0;i<count-2;i++){digit=(digit<<1)|1;}ans=((n+1)|digit);}System.out.println(ans);}// 求低位连续1的个数public static int get(int n){int count=0;while((n&1)==1){n=(n>>1);count++;}return count;}//n转成bit数组public static int[] toArray(int n){int m=n,len=0;while(m!=0){len++;m=(m>>1);}int[] ans=new int[len];len--;while(n!=0){ans[len--]=(n&1);n>>=1;}return ans;}
}

解法二(博客原解):寻找01数对

找到尾部第一对01,将其变成10即可。

特殊情况

1.没有数对01,如10,1000,111等值,在最高位补0即可。

2.按逻辑,10110->11010,而10011处理后的正确答案是:11001。将01变成10后,末尾的1应该全部放到低位,保证值最小。

代码1:比特数组

import java.util.*;
public class Main{public static void main(String[] args){Scanner in=new Scanner(System.in);int n=in.nextInt();int[] arr=toArray(n);n=arr.length;int ans=0;//找到第一对“01”,将其变成“10”for(int i=n-2;i>=0;i--){if(arr[i]==0&&arr[i+1]==1){arr[i]=1;arr[i+1]=0;//i后面的1全部放到低位int j=i+1,k=n-1;while(j<k){if(arr[j]==1){if(arr[k]==0){arr[k]=1;arr[j]=0;j++;k--;}else{k--;}}else{j++;}}// 比特数组转成十进制:二进制转十进制ans=arr[0];for(int idx=1;idx<n;idx++){ans=(ans<<1)|arr[idx];}//处理结束,跳出循环break;}}System.out.println(ans);}//n转成bit数组(高位补0,方便处理)public static int[] toArray(int n){int m=n,len=0;while(m!=0){len++;m=(m>>1);}int[] ans=new int[len+1];while(n!=0){ans[len--]=(n&1);n>>=1;}ans[len]=0;return ans;}
}

代码2:充分利用java自带的api

import java.util.*;
public class Main{public static void main(String[] args){Scanner in=new Scanner(System.in);int n=in.nextInt();char[] arr=("0"+Integer.toBinaryString(n)).toCharArray();int i=arr.length-2;while(i>=0&&!(arr[i]=='0'&&arr[i+1]=='1')){i--;}arr[i]='1';arr[i+1]='0';//i后面的'1'全放到低位int j=i+1,k=arr.length-1;while(j<k){if(arr[j]=='1'){if(arr[k]=='0'){arr[k]='1';arr[j]='0';j++;k--;}else{k--;}}else{j++;}}int ans=arr[0]-'0';for(i=1;i<arr.length;i++){ans=(ans<<1)|(arr[i]-'0');}System.out.println(ans);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SVPWM的飞轮控制系统的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM的飞轮控制系统的simulink建模与仿真。SVPWM的核心思想是将逆变器输出的三相电压矢量在两相静止坐标系&#xff08;αβ坐标系&#xff09;中表示&#xff0c;通过控…

Python3 数据类型详解:掌握数据基石,编写高效程序

Python3 中的基本数据类型包括整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;、布尔值&#xff08;bool&#xff09;、字符串&#xff08;str&#xff09;、列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、集合&#xff08;se…

JAVA static注入 Util使用之Service注入

一般在Util等静态方法中调用Service或mapper&#xff0c;初始化后会出现空指针异常&#xff1a;java.lang.NullPointerException。 代码执行优先级的问题&#xff0c;在一个Java类中&#xff0c;存在着静态代码块&#xff0c;静态方法&#xff0c;构造函数,成员方法等等。不同…

golang中的类和接口

类 在 Go 语言中并没有类的概念&#xff0c;而是使用结构体来实现面向对象的特性。通过 type 关键字可以定义自定义类型&#xff0c;包括结构体类型。下面是一个简单的示例&#xff1a; package mainimport "fmt"// 定义一个结构体类型 type Person struct {Name s…

只对外公开必要的信息和步骤

隐藏内部结构 使对象的内部结构对外部不可见的内容的处理被称为封装化。只公开方法等使用者所需要的最低限度的接口&#xff0c;使用者只能通过外部接口进行访问。如此一来&#xff0c;使用该类的程序就无须知道其内部的具体实现。 通过封装化&#xff0c;不仅可以防止调用者…

Node.js安装及环境配置(超详细!保姆级!!)

目录 一、进入官网地址下载安装包 二、安装程序 三、环境配置 四、测试 五、安装淘宝镜像 一、进入官网地址下载安装包 Node.js — Download Node.js (nodejs.org) 选择对应你系统的 node.js 版本&#xff0c;我选择的是Windows系统&#xff0c;64位 点击图中选项&#…

无人机+应急通信:灾害现场应急通信车技术详解

无人机和应急通信车是灾害现场应急通信中的重要技术。无人机可以通过快速到达灾害现场&#xff0c;搭载高清摄像头、红外热成像仪、激光雷达等设备&#xff0c;对灾区进行实时监测和灾情评估&#xff0c;同时也可以通过搭载的通信设备&#xff0c;与指挥中心进行实时通信和数据…

APP逆向实现方式总览

方式一&#xff1a;硬核分析 梳理出参数的构造逻辑&#xff0c;代码还原算法 方式二&#xff1a;模拟执行 2.1 Frida-RPC 电脑调用已加载到手机内存中的方法&#xff0c;直接获取到结果 2.2 AndServer-RPC 安卓程序调用手机中的方法&#xff0c;最后暴露成HTTP服务供电脑…

✅什么是排他锁、共享锁、意向锁

共享锁 共享锁&#xff0c;又被称为读锁&#xff0c;是由读取操作所创建的一种锁。在此期间&#xff0c;其他用户可以同时读取数据&#xff0c;但在数据上未释放所有共享锁之前&#xff0c;任何事务均无法对其进行修改&#xff08;即获取数据的排他锁&#xff09;。 一旦事务…

202009青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 通过算式123122021120可将二进制1101 转为十进制,下列进制转换结果正确的是?( ) A :0b10转为十进制,结果是2 B :0d10转为十进制,结果是8 C :0x10转为十进制,结果是10 D :0o10转为十进制,结果是16 正确答案:A 试题解析: 第 2 题 【单选题】 语句flo…

基于Nios-II实现流水灯

文章目录 一、新建项目1、选择芯片2、Qsys设计2.1、点击Platform Designer2.2配置软核2.3其他设置 3、Quartus设计3.1添加原理图3.2添加qip文件3.3其他设置3.4驱动设置 4、Nios-II Eslipse设计参考 一、新建项目 使用的Quartus 18.0及以上版本 1、选择芯片 2、Qsys设计 2.1、点…

【AIGC调研系列】你好-GPT-4o

GPT-4o是OpenAI最新发布的一款人工智能模型&#xff0c;它具备处理和生成文本、音频和图像的能力。这个模型的特点是能够实时对这些不同类型的输入进行推理和响应&#xff0c;这使得它在多模态交互方面表现出色[1][2][3]。 GPT-4o的“o”代表“omni”&#xff0c;意味着它是一…

【复试分数线】综合性985历年分数线汇总(第四弹)

国家线和34所自划线 可以看作是考研上岸最最最基础的门槛。真正决定你能不能进入复试的还要看院线&#xff08;复试分数线&#xff09;&#xff01;今天我将分析考信号的除C9、工科类985的其他7所985近三年复试分数线&#xff08;不包括2024&#xff09;&#xff0c;大家可以参…

Azure IoT Hub是啥

1.概要说明 Azure IoT Hub是微软在物联网&#xff08;IoT&#xff09;领域提供的一款重要产品&#xff0c;为设备连接和管理提供了专业的解决方案。以下是关于Azure IoT Hub的详细介绍&#xff1a; 定义&#xff1a;Azure IoT Hub是一个专为连接和管理数百万台物联网设备而设计…

flutter开发实战-人脸识别相机使用

flutter开发实战-人脸识别相机使用 当需要拍摄的时候&#xff0c;需要检测到人脸再进行后续的操作&#xff0c;这里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 检测人脸face_camera: ^0.0.8iOS端需要设置相关权限 在info.plist文件中&…

如何按住ctrl滑动鼠标桌面图标大小不变

如何按住ctrl滑动鼠标桌面图标大小不变 采取以下步骤&#xff1a; 1、鼠标在电脑桌面空白处单击右键&#xff0c;然后在弹出的对话框最上面有个“查看”&#xff0c;点击“查看”出来的最上面有“大图标”“中等图标”“小图标”&#xff0c;根据自己的需要选择图标大小即可。…

网络安全快速入门(九)MySQL进阶操作

上一章我们了解了对表及库的基本增删查改操作&#xff0c;本章我们针对增删查改内容进行与一些拓展&#xff0c; 9.1字段修饰及数据类型 我们之前在创建表时用到的格式为&#xff1a; create table 表名 ( 字段名1 字段数据类型&#xff08;数据类型长度&#xff09;, 字段名2 …

Pytorch学习-调整torchvision.models中模型输出类别数

假设你的类别只有10个&#xff0c;而torchvision.models中Vgg16的输出类别为1000&#xff0c;这时应该如何调整呢&#xff1f; 方法一&#xff0c;直接修改模型中类别的输出。 from torch.nn import Linear import torchvision import torchVgg16torchvision.models.vgg16(pre…

华为认证大数据是什么?华为认证大数据有用吗?

华为大数据是用来搜集整理大数据&#xff0c;提供解决方案的数据中心。华为大数据解决方案是华为公司推出的一种综合性云解决方案&#xff0c;主要针对广告营销、电商、车联网等大数据应用场景的云计算大数据方案&#xff0c;帮助企业用户构建大数据平台&#xff0c;解决企业的…

GRE over IPsec VPN实验

一、拓扑图 二、组网需求 某企业总部、分支1、分支2分别通过 R1&#xff0c;R3&#xff0c;R4 接入互联网&#xff0c;配置默认路由连通公网按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 分别配置 Loopback0 口匹配感兴趣流&#xff0c;Loopback1 口模拟业…