FizzBu​​zz 使用有限数量的条件和 StringBuilder

FizzBuzz using limited number of conditions and StringBuilder

在第一次初级面试中,你们都知道这个微不足道的 fizzbuzz 问题。就我而言,这不仅仅是编写解决方案。还有更多要求:

  1. 只有两个 if\else 语句。
  2. StringBuilder 必填。
  3. 没有Map,Collection.
  4. 没有三元运算符。
  5. 只有 Java 个核心(8 或 11)。
  6. 你只有 5 分钟的时间(对我来说,但对你来说没关系)。

我的解决方案包含三个 if 语句:

for (int i = 0; i <= 100; i++) {
    if (i%3==0 && i%5==0) {
        System.out.println("fizzBuzz");
    } else if (i%5==0) {
        System.out.println("Buzz");
    } else if (i%3==0) {
        System.out.println("fizz");
    } else {
        System.out.println(i);
    }
}

但是,是的,有三个 'if' 而没有 StringBuilder。好的,让我们看两个 'if' 例子:

List<String> answer = new ArrayList<String>();
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(3, "Fizz");
map.put(5, "Buzz");
for (int num = 1; num <= n; num++) {
    String s = "";
    for (Integer key : map.keySet()) {
        if (num % key == 0) {
            s += map.get(key);
        }
    }
    if (s.equals("")) {
        s += Integer.toString(num);
    }
    answer.add(s);
}

又错了:两个 'if' 但没有 StringBuilder.

我可以请求帮助吗?帮我解决这个问题。

我会说你的地图解决方案非常接近,没有人说“没有数组”:)

public class FizzBuzz {

    public static void main(String args[]) {
        StringBuilder sb = new StringBuilder();
        Object[][] m = {{3, "Fizz"}, {5, "Buzz"}};
        for (int i = 1; i <= 100; i++) {
            boolean found = false;
            for (Object[] o : m) {
                if (i % (int) (o[0]) == 0) {
                    found = true;
                    sb.append((String) (o[1]));
                }
            }

            if (!found) {
                sb.append(i);
            }

            sb.append(" ");
        }

        System.out.println(sb.toString());
    }
}

打印

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz

话虽如此,我觉得5分钟对于这种问题来说有点太严格了。

好吧,有一个比 Federico 的答案更简单的解决方案(以我的拙见):

for (int i = 1; i <= 100; i++) {
    StringBuilder sb = new StringBuilder();
    if (i % 3 == 0) {
        sb.append("Fizz");
    }
    if (i % 5 == 0) {
        sb.append("Buzz");
    }
    String str = sb.toString();
    str = str.replaceAll("^$", String.valueOf(i));
    System.out.print(str + " ");
}

这里发生的事情是 Fizz 和 Buzz 被独立存储到 StringBuilder 中,所以如果数字可以同时被 3 和 5 整除,那么内容是 FizzBuzz.

最后,我们将使用 replaceAll("^$", …) 的技巧来有条件地用数字替换空字符串。

这实际上产生了

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz…

除了使用 replaceAll 的技巧,您还可以使用 Optional 来模拟 if/else:

System.out.print(Optional.of(sb.toString())
    .filter(t -> !t.isEmpty())
    .orElse(String.valueOf(i)));

试试这个。

for (int i = 1; i <= 100; i++) {
    StringBuilder sb = new StringBuilder();
    String number = Integer.toString(i);
    if (i % 3 == 0) {
        sb.append("Fizz");
        number = "";
    }
    if (i % 5 == 0) {
        sb.append("Buzz");
        number = "";
    }
    System.out.println(sb.append(number));
}

你也可以不使用 if 语句。

for (int i = 1; i <= 100; i++) {
    StringBuilder sb = new StringBuilder();
    boolean done = (i % 3 == 0 && sb.append("Fizz") == sb)
                 | (i % 5 == 0 && sb.append("Buzz") == sb)
                 || sb.append(i) == sb;
    System.out.println(sb);
}
import java.util.HashMap;
import java.util.Map;

public class FizzBuzz {

    public static void main(String[] args) {
        HashMap<Long, String> game = new HashMap<>(Map.of(
                3L, "Fizz",
                5L, "Buzz",
                23L, "Custom"));
        System.out.println(fizzBuzz(100, game));
    }

    public static String fizzBuzz(int size, HashMap<Long, String> game) {
        StringBuilder output = new StringBuilder();
        for (int i = 1; i <= size; i++) {

            boolean empty = true;
            for (Long divisor : game.keySet()) {
                if (i % divisor == 0) {
                    output.append(game.get(divisor));
                    empty = false;
                }
            }

            if (empty) {
                output.append(i);
            }
            output.append("\n");
        }

        return output.toString();
    }
}
import java.util.*;

public class FizzBuzz {

    public static void main(String[] args) {
        String[] params = {"Fizz\n3","Buzz\n5"};
        
        for (int i = 1; i ++< 100;) {
            StringBuilder buffer = new StringBuilder();
            for (String param: params) {
                Scanner reader = new Scanner(param);
                String str = reader.nextLine();
                int x = reader.nextInt();
                reader.close();
                if (i % x == 0) {
                    buffer.append(str);
                }
            }
            if (buffer.length() == 0) {
                buffer.append(i);
            }
            System.out.println(buffer.toString());
        }
    }

}