編寫一個程序,輸出從1到n的數字的字符串表示


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)來得到字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM