前往
大廳
主題

LeetCode - 2081. Sum of k-Mirror Numbers 解題心得

Not In My Back Yard | 2022-05-18 12:00:18 | 巴幣 0 | 人氣 158

題目連結:


題目意譯:
一個 k-鏡像(k-mirror)數字為沒有前導零的一個正整數,其滿足在十進位中從左至右讀與從右至左讀是相同的,並且於 k 進位中也滿足左至右、右至左讀起來一模一樣。

例如,9 為一個 2-鏡像數字。數字 9 於十進位以及二進位的表示法依序為 9 和 1001,兩者皆滿足左至右、右至左讀起來一樣。
相反地,4 不是一個 2-鏡像數字。數字 9 於二進位的表示法為 100,其並不滿足左至右、右至左讀起來一樣。

給定進位制 k 以及數字 n,回傳前 n 小的 k-鏡像數字之總和。

限制:
2 ≦ k ≦ 9
1 ≦ n ≦ 30



範例測資:
範例 1:
輸入: k = 2, n = 5
輸出: 25
解釋:
前 5 小的 2-鏡像數字以及它們於二進位的表示法列於下方:
  base-10    base-2
    1          1
    3          11
    5          101
    7          111
    9          1001
它們的總和 = 1 + 3 + 5 + 7 + 9 = 25。

範例 2:
輸入: k = 3, n = 7
輸出: 499
解釋:
前 7 小的 3-鏡像數字以及它們於三進位的表示法列於下方:
  base-10    base-3
    1          1
    2          2
    4          11
    8          22
    121        11111
    151        12121
    212        21212
它們的總和 = 1 + 2 + 4 + 8 + 121 + 151 + 212 = 499。

範例 3:
輸入: k = 7, n = 17
輸出: 20379000
解釋: 前 17 小的 7-鏡像數字為:
1, 2, 3, 4, 5, 6, 8, 121, 171, 242, 292, 16561, 65656, 2137312, 4602064, 6597956, 6958596


解題思維:
直接窮舉出前 n 小的 k-鏡像數字即可。窮舉方式如下:
我們可以先由小到大窮舉出 k 進位的迴文數(也就是左到右與右到左相同),然後再檢查目前窮舉出的數字是不是也在十進位中是迴文數(當然,也可以先窮舉十進位再於 k 進位檢查)。如果是則代表該數字為一個 k-鏡像數字。

那要怎麼由小到大窮舉所有 k 進位迴文數呢?
可以看到前 k - 1 小的迴文數就是 1 、 2 、……、k - 1,而這些數字同時也是 k-鏡像數字(因為 k < 10)。可以看到它們的「長度」為 1 位數,不過我們需要額外在這邊包含數字「0」,之後的窮舉會用到(根據這邊的定義,該數字不得算進鏡像數字內);
接著「長度」為 2 位數的迴文數,則是 11 、 22 、 33 等等,而對於其中每一個數字我們需要檢查其在十進位是不是迴文數。如上,這邊也需要包含數字「00」,但一樣不得算進鏡像數字內。

接下來,可以看到我們可以從長度 1 位數的迴文數字兩側加上相同的數字,而得到一個長度 3 位數的迴文數;相似地,可以從長度 2 位數的迴文數字兩側加上相同的數字而得到長度 4 位數的迴文數字;長度 3 得到長度 5;長度 4 得到長度 6……以此類推。

而為了要保持窮舉的順序是由小到大,我們對於兩側加入的也是由小到大窮舉。
以長度 3 的迴文數為例,其最小者為 000,也就是數字 0(這就是為何需要數字 0)兩側加上 0、下一個則是 010、再下一個則為 020、……之後便到 101 、 111 等等。

而跟前面類似,會放入兩側是 0 的數字是為了之後窮舉長度 5 位數的迴文而使用。除此之外的數字,對於每一個數字我們都去檢查它是不是在十進位也是迴文。

以上。我們便可以依序窮舉出前 n 小的 k-鏡像數字,此時將它們加總起來即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作