【演算法】LeetCode演算法題-Count And Say
這是悅樂書的第153次更新,第155篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第12題(順位題號是38)。count-and-say序列是整數序列,前五個術語如下:
-
1
-
11
-
21
-
1211
-
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 小結
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!