1. 程式人生 > >168.excel-sheet-column-title

168.excel-sheet-column-title

這道題乍一看挺簡單的,就是10進位制轉換26進位制的問題,但是,並非我們平時所說的10進位制到26進位制的轉換方法,用短除法求出來的結果和測試用例不太吻合,這主要是題目做了一點小小的變動。

題目大致意思:1-26分別對應A~Z這26個字母,AA表示27, AB表示28,……,AZ表示52,……,程式給定一個int型正數,則按照上述規則,求如何轉化出對應的字母。

根據題意,這並不是一個完全的26進位制轉化問題,因為通常的進位制轉化我們要包含0,也就是說,如果是26進位制的數,我們應該是0~25才對,當十進位制是26的時候,實際上通常意義上的26進位制數是10,但現在系統應該輸出的是26,也就說原本的0~25變成了1~26,其本質並未發生改變,因為相差一,那需要做的是將原數字減一然後在進行正常操作,舉個例子就明白了,以26為例,如果正常的26進位制,該位需要進位,低位需要變0,也就是前面說的10,如果用0~25分別對應的是‘A’~‘Z',那26是AA。但是在新的規則下,所有的都差了1,1~26表示A~Z,所以我們的26不能進位,所以,實際上,當前的26輸出和標準情況下25的輸出是一樣的,而且所有數的情況都是一樣的,因此,在進行操作的時候都要對原數進行-1操作後取餘。比如26我們做的操作是(26-1)%26 == 25, 'A'+25 == 'Z',同樣的,52(2*26):'AZ',(52-1)%26 == 25:'Z', 51/26==1, (1-1)%26:'A',676(26*26),也是同樣的道理。

以下是程式碼,可自行體會一下:

class Solution {
public:
    string convertToTitle(int n) {
        string res = "";
        while (n>0) {
            res = (char)('A'+((n-1)%26))+res;
            n = (n-1)/26;
        }
        return res;
    }
};