摘要:問題描述輸入一個整數(shù),輸出該數(shù)二進制表示中的個數(shù)。其中負數(shù)用補碼表示。思路方法將二進制變成字符數(shù)組,遍歷數(shù)組統(tǒng)計的個數(shù),這種辦法不需要考慮正負數(shù)。遍歷字符數(shù)組,統(tǒng)計的個數(shù)判斷該位是否是,如果是就,否則執(zhí)行下一次循環(huán)。的二進制表示想右移一位。
1.問題描述
輸入一個整數(shù),輸出該數(shù)二進制表示中1的個數(shù)。其中負數(shù)用補碼表示。
2.思路方法1:將二進制變成字符數(shù)組,遍歷數(shù)組統(tǒng)計1的個數(shù),這種辦法不需要考慮正負數(shù)。
1 public class Solution { 2 public int NumberOf1(int n) { 3 String s = Integer.toBinaryString(n);//將n變成二進制之后變成字符串 4 char[] num = s.toCharArray();//將字符串變成字符數(shù)組 5 int count = 0;//定義一個變量,用來計數(shù),統(tǒng)計1的個數(shù)。 6 for(int i = 0; i < num.length; i++){//遍歷字符數(shù)組,統(tǒng)計1的個數(shù) 7 if(num[i] == "1"){//判斷該位是否是1,如果是1,count就++,否則執(zhí)行下一次循環(huán)。 8 count++; 9 } 10 } 11 return count;//返回1的個數(shù)。 12 } 13 }
方法2:一種很巧妙的辦法——n&(n-1)
解釋一下:n-1之后,就把二進制表示種的從右開始的第一個1變成了0,同時把第一個1右邊的0變成了1.例如1100,減1之后就是1011,再和1100(也就是n)進行&運算結(jié)果就是1000,然后將結(jié)果賦值給n,把最右邊的1變成了0,這樣循環(huán),直到n變成0停止,循環(huán)過程統(tǒng)計1出現(xiàn)的次數(shù)即可。
1 public class Solution { 2 public int NumberOf1(int n) { 3 int count = 0;//定義計數(shù)器變量 4 while(n != 0){//n不等于0就循環(huán) 5 count++;//n不為0,那么n的二進制表示中就必有1,所以count++. 6 n = n&(n-1);//這個過程就是把n的二進制表示的最右邊的1變成0,其他位不變,然后再賦值給n。 7 } 8 return count;//返回計數(shù)器的的結(jié)果。 9 } 10 }
方法3:無符號右移
思路就是把整數(shù)n變成二進制表示后逐個判斷最低位是否是1,如果是1就讓計數(shù)器加1,然后進行無符號右移1位,如果不是1,就直接右移1位,直到傳入的整數(shù)n變成0停止。
(因為無符號位移不管最高位是0還是1,右移之后都用0補齊,所以不需要考慮正負數(shù)的問題)
1 public class Solution { 2 public int NumberOf1(int n) { 3 int count = 0;//計數(shù)器 4 while(n!=0){//n不為0才執(zhí)行循環(huán) 5 count+=n&1;//這里很巧妙,n&1,用來判斷最后以為是不是1,如果是1,執(zhí)行前面count+=1;如果不是1,那么n&1的結(jié)果就是0,count就不變。 6 n = n>>>1;//n的二進制表示想右移一位。 7 } 8 return count;//返回結(jié)果。 9 } 10 }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75422.html
摘要:圖解第二種算法圖解代碼示例算法如果為真,說明拿到的是二進制序列的個數(shù)為算法為的時候說明已經(jīng)拿完了,循環(huán)終止二進制序列中的個數(shù)以上代碼,還可做優(yōu)化在此僅作參考,若有更好的算法,還望能夠私信告知,多謝各位。 ?前言?: 算法是一個程序員的內(nèi)功,能很好的體現(xiàn)程序員的編程思維,通過學習和掌握常見的算...
摘要:題目輸入一個整數(shù),輸出該數(shù)二進制表示中的個數(shù)。其中負數(shù)用補碼表示。二進制與運算符符號為,表示若兩個二進制位都為,則結(jié)果為,否則為。所以用于比較的這個數(shù)字初始值為,比較完后讓左移位,這樣就可以依次比較所有位是否為。 題目 輸入一個整數(shù),輸出該數(shù)二進制表示中1的個數(shù)。其中負數(shù)用補碼表示。 分析 這是一道考察二進制的題目 二進制或運算符(or):符號為|,表示若兩個二進制位都為0,則結(jié)果為0...
摘要:劍指系列刷題第一篇題目來源數(shù)組中數(shù)字出現(xiàn)的次數(shù)大家可以去測試一下自己的代碼博主碼云鏈接文章目錄前言題目描述解題思路解題代碼前言這是劍指系列刷題第一篇文章,大家可以互相學習一下。其中的兩個單身狗是和。 ...
摘要:導航小助手劍指從尾到頭打印鏈表題目詳情解題思路源代碼總結(jié)劍指從尾到頭打印鏈表題目詳情輸入一個鏈表的頭節(jié)點,從尾到頭反過來返回每個節(jié)點的值用數(shù)組返回。時間復雜度方法先反轉(zhuǎn)鏈表并求長度,在將反轉(zhuǎn)后的鏈表數(shù)據(jù)拷貝至數(shù)組中。 ...
閱讀 1882·2021-11-25 09:43
閱讀 3177·2021-11-15 11:38
閱讀 2718·2019-08-30 13:04
閱讀 494·2019-08-29 11:07
閱讀 1508·2019-08-26 18:37
閱讀 2743·2019-08-26 14:07
閱讀 594·2019-08-26 13:52
閱讀 2289·2019-08-26 12:09