Example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
n = 15,
Return: [ "1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz" ]
|
常規思路
題目很簡單,就是n為3倍數時輸出Fizz
,n為5倍數時輸出Buzz
,n同時為3或5倍數時輸出FizzBuzz
。也就是說,在判斷條件時,應該先判斷n是否為15的倍數,接着再判斷是否為3或者5的倍數來決定輸出什么。代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class Solution { public List<String> fizzBuzz(int n) { List<String> list = new ArrayList<>(n); 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; } }
|
這里說一句,好像LeetCode在代碼中使用了List時是不需要導包的,我試了下不管在第一行加不加import java.util.*;
都沒問題。
下面是時間與內存的消耗:
Runtime: 1 ms
Memory Usage: 37.2 MB
特殊思路
上邊是通過%
進行了取模運算來實現的,看了評論區有人認為:
一般來說,對於CPU取余數的運算相對來說效率很低,如果可以避免使用大量的求余數操作,可以提升程序的性能。
於是就有了不使用%
的寫法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
public class Solution { public List<String> fizzBuzz(int n) { List<String> ret = new ArrayList<String>(n); for(int i=1,fizz=0,buzz=0;i<=n ;i++){ fizz++; buzz++; if(fizz==3 && buzz==5){ ret.add("FizzBuzz"); fizz=0; buzz=0; }else if(fizz==3){ ret.add("Fizz"); fizz=0; }else if(buzz==5){ ret.add("Buzz"); buzz=0; }else{ ret.add(String.valueOf(i)); } } return ret; } }
|
下面是時間與內存的消耗:
Runtime: 1 ms
Memory Usage: 37.3 MB
這個方案里需要對兩個變量進行重復的自增和重新賦值為0,可以用下邊的方案來減少這些操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public class Solution { public List<String> fizzBuzz(int n) { List<String> result = new ArrayList<>(); if(n < 1) return result; for(int i = 1, fizz = 3, buzz = 5; i <= n; i++) { String addVal = null; if(i == fizz && i == buzz) { addVal = "FizzBuzz"; fizz += 3; buzz += 5; } else if(i == fizz) { addVal = "Fizz"; fizz += 3; } else if(i == buzz) { addVal ="Buzz"; buzz += 5; } else addVal = String.valueOf(i); result.add(addVal); } return result; } }
|
下面是時間與內存的消耗:
Runtime: 1 ms
Memory Usage: 37.1 MB
補充:i+""
和String.valueOf(i)
which is better between
list.add( “” + i );
and
addStr = String.valueOf(i); list.add(addStr)?
我認為后者的寫法更好,因為i+""
實際上會new一個StringBuilder去拼接i
和""
,然后再調用toString()來得到字符串。而String.valueOf(i)
在底層是調用了Integer.toString(i)
來得到字符串。