写一个程序,输出从 1 到 n 数字的字符串表示。

1. 如果 是3的倍数,输出“Fizz”;

2. 如果 是5的倍数,输出“Buzz”;

3.如果 同时是3和5的倍数,输出 “FizzBuzz”。

示例:

n = 15,

返回:
[
    "1",
    "2",
    "Fizz",
    "4",
    "Buzz",
    "Fizz",
    "7",
    "8",
    "Fizz",
    "Buzz",
    "11",
    "Fizz",
    "13",
    "14",
    "FizzBuzz"
]
Related Topics
  • 数学
  • 字符串
  • 模拟

  • 👍 115
  • 👎 0
  • 每日一题刷题打卡,15个一组,第3、5、6、9、10、12、15位对应字符串。
    剩下的部分自行把int型转为String型,当然你也可以直接使用Integer.toString(num);来实现。
    我这边的写法也是参考的Integer.toString(num);的源码来写的,中间省去了一些确定范围之类的逻辑,相对更加简单点。

    class Solution {
    
        int [] sizeArray = { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE };
    
        char[] numArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    
        boolean[] ifString = {false,false,false,true,false,true,true,false,false,true,true,false,true,false,false,true};
    
        String[] stringArray = new String[]{null,null,null,"Fizz",null,"Buzz","Fizz",null,null,"Fizz","Buzz",null,"Fizz",null,null,"FizzBuzz"};
    
        public List<String> fizzBuzz(int n) {
            List<String> list = new ArrayList<>();
            int num = 1;
            int idx = 1;
            while (num <= n){
                list.add( ifString[idx] ? stringArray[idx] : numToString(num) );
                num ++;
                idx = idx==15 ? 1 : idx+1;
            }
            return list;
        }
    
        public String numToString(int num){
            int size = stringSize(num);
            char[] chars = new char[size];
            while (num>0){
                chars[--size] = numArray[num%10];
                num = num/10;
            }
            return new String(chars);
        }
    
        public int stringSize(int num) {
            for (int i=0; ; i++)
                if (num <= sizeArray[i])
                    return i+1;
        }
    }
    

    正常点来说,你可以选择依次遍历,余3输出”Fizz”、余5输出”Buzz”、都余输出”FizzBuzz”,其他的输出当前数字即可