這是悅樂書的第221次更新,第233篇原創
01 看題和准備
今天介紹的是LeetCode算法題中Easy級別的第88題(順位題號是412)。
編寫一個程序,輸出從1到n的數字的字符串表示。但對於三的倍數,它應輸出“Fizz”而不是數字,對於五的倍數,應該輸出“Buzz”。 對於三和五共同的倍數,應輸出“FizzBuzz”。例如:
輸入:n = 15
輸出:["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"]
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
將n轉為對應的字符串,分為三種情況:
1、是3或者5的倍數,那么n轉為"Fizz"或者"Buzz"。
2、是3和5的共同倍數,那么n轉為"FizzBuzz"。
3、不是前兩種情況,那么n直接轉為字符串。
因此,直接使用取余,判斷余數是否為0,來分別對應上述三種情況,將對應的字符串添加進list中即可。
此解法時間復雜度為O(n),空間復雜度為O(1)。
public List<String> fizzBuzz(int n) {
List<String> list = new ArrayList<String>();
for (int i=1; i<= n; i++) {
if (i%3 != 0) {
if (i%5 != 0) {
list.add(i+"");
} else {
list.add("Buzz");
}
} else {
if (i%5 != 0) {
list.add("Fizz");
} else {
list.add("FizzBuzz");
}
}
}
return list;
}
03 第二種解法
在第一種解法里,我們分析了三種需要判斷的情況,對於第二種情況,可以直接用n對15取余來判斷。
此解法時間復雜度為O(n),空間復雜度為O(1)。
public List<String> fizzBuzz2(int n) {
List<String> list = new ArrayList<String>();
for (int i = 1; i <= n; i++) {
if (i % 15 == 0) {
list.add("FizzBuzz");
} else if (i % 3 == 0) {
list.add("Fizz");
} else if (i % 5 == 0) {
list.add("Buzz");
} else {
list.add(i+"");
}
}
return list;
}
04 第三種解法
使用兩個變量計數(也可以理解為雙指針),替換取余算法。
當某一變量等於3或者5時,將其所代表的Fizz或者Buzz字符串添加進list,然后變量歸零。當一變量等於3,且另一變量等於5時,將FizzBuzz添加進list,然后兩變量同時歸零。
此解法時間復雜度為O(n),空間復雜度為O(1)。
public List<String> fizzBuzz3(int n) {
List<String> list = new ArrayList<String>();
int Fizz = 0, Buzz = 0;
for (int i = 1; i <= n; i++) {
Fizz++;
Buzz++;
if (Fizz == 3 && Buzz == 5) {
list.add("FizzBuzz");
Fizz = 0;
Buzz = 0;
} else if(Fizz == 3) {
list.add("Fizz");
Fizz = 0;
} else if(Buzz == 5) {
list.add("Buzz");
Buzz = 0;
} else {
list.add(i+"");
}
}
return list;
}
05 小結
算法專題目前已連續日更超過兩個月,算法題文章88+篇,公眾號對話框回復【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什么好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!