找數字-算法

解法一、數位模擬

比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.pswp.cn/diannao/12575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12575.shtml
英文地址,請注明出處:http://en.pswp.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 口模擬業…