1. 程式人生 > 其它 >【LeetCode刷題筆記(六十二)】 之 5620 連線二進位制數字

【LeetCode刷題筆記(六十二)】 之 5620 連線二進位制數字

技術標籤:# LeetCodejavaleetcode字串

本文章由公號【開發小鴿】釋出!歡迎關注!!!


老規矩–妹妹鎮樓:

一. 題目

(一) 題幹

給你一個整數 n ,請你將 1 到 n 的二進位制表示連線起來,並返回連線結果對應的 十進位制 數字對 109 + 7 取餘的結果。

(二) 示例

示例 1:

輸入:n = 1
輸出:1
解釋:二進位制的 "1" 對應著十進位制的 1

示例 2:

輸入:n = 3
輸出:27
解釋:二進位制下,123 分別對應 "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(); } }