【LeetCode刷題筆記(六十二)】 之 5620 連線二進位制數字
阿新 • • 發佈:2020-12-07
本文章由公號【開發小鴿】釋出!歡迎關注!!!
老規矩–妹妹鎮樓:
一. 題目
(一) 題幹
給你一個整數 n ,請你將 1 到 n 的二進位制表示連線起來,並返回連線結果對應的 十進位制 數字對 109 + 7 取餘的結果。
(二) 示例
示例 1:
輸入:n = 1
輸出:1
解釋:二進位制的 "1" 對應著十進位制的 1 。
示例 2:
輸入:n = 3
輸出:27
解釋:二進位制下,1,2 和 3 分別對應 "1" ,"10" 和 "11" 。
將它們依次連線,我們得到 "11011" ,對應著十進位制的 27 。
示例 3:
輸入:n = 12
輸出:505379714
解釋:連線結果為 "1101110010111011110001001101010111100" 。
對應的十進位制數字為 118505380540 。
對 109 + 7 取餘後,結果為 505379714 。
提示:
1 <= n <= 105
二. 題解
(一) 思路
從題目上來看,這是一個十進位制轉二進位制,再轉十進位制的問題,如果按照這種思路硬做的話會比較麻煩。再仔細分析,可以得出這是一個二進位制的左移問題,給出整數n,從1開始連線二進位制數一直到n,我們發現,已經連線過的數在這個過程中會不斷地左移,每次左移的位數都是當前整數的二進位制位數, 然後加上當前的整數。因此,可以得出遞推公式:
res = res << 二進位制位數(i) + I;
因此,可以從1開始迭代到n,得出最終的結果,不過要注意的是這種數值比較大的運算中要時刻警惕溢位的問題,首先,我們需要設定res結果為Long型別,同時在每個迭代中也要及時地取模防止溢位問題出現。
(二) 程式碼實現
Java:
class Solution {
public int concatenatedBinary(int n) {
//獲取每個數字轉換為二進位制的長度
int mod = 1000000007;
//二進位制移位
//當前的結果左移二進位制的位數 + 當前的數
long res = 0;
for(int i = 1; i <= n; ++i){
res = ((res << ten2two(i)) + i) % mod;
}
return (int)res;
}
public int ten2two(int ten){
StringBuilder out = new StringBuilder();
while(ten != 0){
out.append(ten % 2);
ten /= 2;
}
return out.length();
}
}