1. 程式人生 > >【算法】LeetCode算法題-Count And Say

【算法】LeetCode算法題-Count And Say

對象 nds iou 得到 eas for 結果 支持 amp

這是悅樂書的第153次更新,第155篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第12題(順位題號是38)。count-and-say序列是整數序列,前五個術語如下:

  1. 1

  2. 11

  3. 21

  4. 1211

  5. 111221

1被讀作“一個一”或者11。第二項的值是第一項的讀法。

11被讀作“兩個一”或者21。第三項的值是第二項的讀法。

21被讀作“一個二,兩個一”或者1211。第四項的值是第三項的讀法。

給定整數n,其中1≤n≤30,生成count-and-say序列的第n項。整數序列的每個術語將表示為一個字符串。例如:

輸入:1

輸出:“1”

輸入:4

輸出:“1211”

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

02 第一種解法

第一步,界定n的範圍,在1到30之間。

第二步,處理特殊情況,n為1的時候,可以直接返回字符串1。

第三步,通過題意,我們知道了n代表的字符串是n-1代表的字符串的讀法,即n-1表示的字符串讀法就是我們想要的答案。

第一層循環,從1開始循環,直到不小於n,並且接受內層循環的處理結果當做進入下一次循環的條件。

第二層循環,對初始值為“1”的previous字符串進行處理。

第三層循環,順位判斷該字符串每一位字符重復出現的次數,此循環至少會走一次,再將每個字符和其出現的次數拼接成字符串,最後將得到此字符串的讀法。

public String countAndSay(int n) {
    if (n > 30 || n < 0) {
        return "";
    }
    if (n == 1) {
        return "1";
    }
    String previous = "1";
    for (int j = 1; j < n; j++) {
        String str = "";
        for (int i = 0; i < previous.length(); i++) {
            char cc = previous.charAt(i);
            int count = 0;
            while (i < previous.length() && cc == previous.charAt(i)) {
                count++;
                i++;
            }
            i--;
            str = str + count + cc;
        }
        previous = str;
    }
    return previous;
}

03 第二種解法

第一種解法用了三層循環,其實還可以簡化下,變成兩層循環,將內層的兩個循環變成一個。先將字符串第一個字符作為初始條件放在外面,初始化記數為1,然後開始循環,從字符串索引1開始,判斷第0位和第1位字符是否相等,相等count就加1,繼續循環,如果不相等,拼接字符串,並將count還原為1,判斷對象由第0位字符換成第1位字符,繼續循環。

public String countAndSay2(int n) {
    if (n > 30 || n < 0) {
        return "";
    }
    if (n == 1) {
        return "1";
    }
    String previous = "1";
    for (int j = 1; j < n; j++) {
        String str = "";
        char c = previous.charAt(0);
        int count = 1;
        for (int i = 1; i < previous.length(); i++) {
            char cc = previous.charAt(i);
            if (cc == c) {
                count++;
            } else {
                str = str + count + c;
                count = 1;
                c = cc;
            }
        }
        str = str + count + c;
        previous = str;
    }
    return previous;
}

04 小結

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

【算法】LeetCode算法題-Count And Say