持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
前言
题目来源
题目介绍
给你一个整数 n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer(下标从 1 开始)返回结果,其中:
answer[i] == "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。 answer[i] == "Fizz" 如果 i 是 3 的倍数。 answer[i] == "Buzz" 如果 i 是 5 的倍数。 answer[i] == i (以字符串形式)如果上述条件全不满足。
题目分析
从题目中分析知道,已知给一个整数n,要按照它的条件满足一些输出,然后返回一个长度为n的数组。
并且这个数组的某个位置上的下标,如answer[i],i就是下标从1开始,如果i满足3和5的倍数、3的倍数、5的倍数、都不是。4个条件分别输出对应位置上的结果。因此我们知道应该遍历一个for循环,下标从1开始做判断,然后给对应下标的值赋值。
解题验证
class Solution {
public List<String> fizzBuzz(int n) {
List answer=new ArrayList<String>();
for(int i=1;i<=n;i++){
if(i%5==0 && i%3==0){
answer.add("FizzBuzz");
} else {
if(i%5==0){
answer.add("Buzz");
}
else if(i %3 == 0){
answer.add("Fizz");
}else{
answer.add(i+"");
}
}
}
return answer;
}
}
如上代码块,定义好一个集合,往里面添加对应的元素,对应不同的条件,得到最终的结果。
但是可以看到这种方式还是比较效率的
官方答案与分析
class Solution {
public List<String> fizzBuzz(int n) {
List<String> answer = new ArrayList<String>();
for (int i = 1; i <= n; i++) {
StringBuffer sb = new StringBuffer();
if (i % 3 == 0) {
sb.append("Fizz");
}
if (i % 5 == 0) {
sb.append("Buzz");
}
if (sb.length() == 0) {
sb.append(i);
}
answer.add(sb.toString());
}
return answer;
}
}
这是官方的答案,执行结果如下
本质是一样的,通过for遍历,添加到集合,从内存消耗上来说官方的更省一点内存。改善一下我们之前写的,把最后整数转为字符串这一步改成
String.valueOf(i),取代用+号去做类型转换,效率更高,更省内存。
总结
这道题的难易程度可以看出是相对很简单的,考验我们能正常使用for遍历,下标从1开始、if else的判断逻辑是否缜密。