编写一个程序,输出从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)来得到字符串。

猜你喜欢

转载自www.cnblogs.com/yixiaogo/p/11204470.html