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

  • 相关阅读:
    C#串口通信程序SerialPort类
    51单片机和PC串口异步通信
    Robotics ToolBox机械臂仿真
    51单片机和PC串口异步通信(续)
    谈谈FFT有何用
    volatile关键字的使用
    如何走好后面的路
    51单片机液晶显示计时器
    IDE86汇编语言环境使用
    不使用跳转的宏CV_IMIN分析
  • 原文地址:https://www.cnblogs.com/yixiaogo/p/11204470.html
Copyright © 2020-2023  润新知