1. 程式人生 > >LeetCode演算法題-Excel Sheet Column Title(Java實現)

LeetCode演算法題-Excel Sheet Column Title(Java實現)

這是悅樂書的第180次更新,第182篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第39題(順位題號是168)。給定正整數,返回Excel工作表中顯示的相應列標題。例如:

1 - > A.

2 - > B.

3 - > C.

26 - > Z.

27 - > AA

28 - > AB

輸入:1
輸出:“A”


輸入:28
輸出:“AB”


輸入:701
輸出:“ZY”

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

通過題目的幾個小例子,最後得到的字串結果,可以將其拆分兩部分,一部分是除以26的商,一個是除以26的餘數,餘數肯定是會小於26的,但是商卻是有可能大於26的,這時就需要利用迴圈或者遞迴來處理。

當n小於等於0的時候,直接返回空串。

當n小於27的時候,是可以直接在A-Z裡面取到值的,因為A本身代表1,所以要減去1。

當n大於27的時候,這時需要判斷能否被26整除,也就是對26進行取餘是否等於0,如果是26的整數倍,最後一位肯定代表的是Z,而前面的數就需要除以26再減1,減1是相當於n除以26的商向前移動一位,直到處理完所有資料,此步驟是遞迴操作的,因為這部分的數也是符合這三步判斷的。如果不能被整除,那麼最後一位所代表的就是n對26取餘的餘數所表示的字母,即餘數和字元A的和再減1,因為A本身代表的就是1,而前面部分需要處理的就是n除以26的商再進行遞迴處理。

public String convertToTitle(int n) {
    if (n <= 0) {
        return "";
    }
    if (n < 27) {
        return "" + (char) ('A' + n - 1);
    } else {
        if (n % 26 == 0) {
            return convertToTitle(n / 26 - 1) + "Z";
        } else {
            return convertToTitle(n / 26) + (char) ('A' + n % 26 - 1);
        }
    }
}


03 第二種解法

此解法我們使用迴圈來處理資料,如果不使用第一種解法的判斷,遇上26或者它的倍數的時候,拿到Z?如果直接用n對26取餘,再和字元A相加,是得不到Z的,用n除以26的商更加得不到,這時我們可以想個折中的辦法,先把n減1,再去對26取餘,然後和字元A相加,因為A本身代表1,就相當於減去的1又補回來了。得到字串後,此時的n等於n減去1再除以26的商。

public String convertToTitle2(int n) {
    String str = "";
    while (n != 0) {
        int rem = (n - 1) % 26;
        str = (char) (rem + 'A') + str;
        n = (n - 1) / 26;
    }
    return str;
}


04 第三種解法

此解法更加喪心病狂,居然只有一行,是討論區某位大神的傑作,真是佩服,為了可讀性,將其改動了下。

public String convertToTitle3(int n) {
    if (n == 0) {
        return "";
    } else {
        return convertToTitle3(--n/26) + (char) ('A' + (n % 26));
    }
}


05 小結

演算法專題目前已連續日更超過一個月,演算法題文章39+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!