如何用返回语句来完成Codingbat中的FizzBuzz练习?
我上次用来解决这个问题的代码是:
public String[] fizzBuzz(int start, int end) {
String[] a = new String[end - start];
for(int i = start; i < end; i++) a[i - start] = i % 15 == 0 ? "FizzBuzz" : i % 3 == 0 ? "Fizz" : i % 5 == 0 ? "Buzz" : String.valueOf(i);
return a;
}我的目标是拥有如下代码:
public String[] fizzBuzz(int start, int end) {
return foo;
}问题
这是著名的FizzBuzz问题的稍微困难的版本,有时作为面试的第一个问题。(另见:FizzBuzz码.)考虑从start开始并一直运行到但不包括end的数字序列,例如,start=1和end=5给出了序列1、2、3、4。返回一个新的
String[]数组,其中包含这些数字的字符串形式,除3的倍数外,使用"Fizz“代替数字,5的倍数使用"Buzz",以及3和5的倍数同时使用"FizzBuzz”。在Java中,String.valueOf(xxx)将生成int或其他类型的字符串形式。这个版本比通常的版本要复杂一些,因为您必须分配数组并将其索引到数组中,而不仅仅是打印,而且我们改变了开始/结束,而不是总是只执行1..100。
测试用例
fizzBuzz(1, 6) → ["1", "2", "Fizz", "4", "Buzz"]
fizzBuzz(1, 8) → ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7"]
fizzBuzz(1, 11) → ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz"]
fizzBuzz(1, 16) → ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"]
fizzBuzz(1, 4) → ["1", "2", "Fizz"]
fizzBuzz(1, 2) → ["1"]
fizzBuzz(50, 56) → ["Buzz", "Fizz", "52", "53", "Fizz", "Buzz"]
fizzBuzz(15, 17) → ["FizzBuzz", "16"]
fizzBuzz(30, 36) → ["FizzBuzz", "31", "32", "Fizz", "34", "Buzz"]
fizzBuzz(1000, 1006) → ["Buzz", "1001", "Fizz", "1003", "1004", "FizzBuzz"]
fizzBuzz(99, 102) → ["Fizz", "Buzz", "101"]
fizzBuzz(14, 20) → ["14", "FizzBuzz", "16", "17", "Fizz", "19"]发布于 2019-10-06 19:55:24
在没有任何Java 8特性的情况下,我能想象的唯一方法是将数组转换为字符串,将字符串数组转换为字符串数组,其中有些非常.语用正则表达式但我想无论如何解决方案都不是很好。虽然它通过了所有的测试用例,所以它实现了通过测试驱动的开发所能达到的所有目标.
在现实生活中,永远不要写任何与此类似的东西!
import java.util.Arrays;
public class OneLineFizzBuzz
{
public static void main(String[] args)
{
OneLineFizzBuzz f = new OneLineFizzBuzz();
String[] result = f.fizzBuzz(1000, 1006);
System.out.println(Arrays.toString(result));
check(f.fizzBuzz(1, 6), new String[]{"1", "2", "Fizz", "4", "Buzz"});
check(f.fizzBuzz(1, 8), new String[]{"1", "2", "Fizz", "4", "Buzz", "Fizz", "7"});
check(f.fizzBuzz(1, 11), new String[]{"1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz"});
check(f.fizzBuzz(1, 16), new String[]{"1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"});
check(f.fizzBuzz(1, 4), new String[]{"1", "2", "Fizz"});
check(f.fizzBuzz(1, 2), new String[]{"1"});
check(f.fizzBuzz(50, 56), new String[]{"Buzz", "Fizz", "52", "53", "Fizz", "Buzz"});
check(f.fizzBuzz(15, 17), new String[]{"FizzBuzz", "16"});
check(f.fizzBuzz(30, 36), new String[]{"FizzBuzz", "31", "32", "Fizz", "34", "Buzz"});
check(f.fizzBuzz(1000, 1006), new String[]{"Buzz", "1001", "Fizz", "1003", "1004", "FizzBuzz"});
check(f.fizzBuzz(99, 102), new String[]{"Fizz", "Buzz", "101"});
check(f.fizzBuzz(14, 20), new String[]{"14", "FizzBuzz", "16", "17", "Fizz", "19"});
}
private static void check(String[] fizzBuzz, String[] strings)
{
boolean passed = Arrays.equals(fizzBuzz, strings);
System.out.println(Arrays.toString(fizzBuzz) + " passed? " + passed);
if (!passed)
{
System.out.println("Whoopsie...");
}
}
public String[] fizzBuzz(int start, int end)
{
return (start == end ? ""
: (start % 15 == 0 ? "FizzBuzz"
: start % 3 == 0 ? "Fizz"
: start % 5 == 0 ? "Buzz" : String.valueOf(start))
+ Arrays.toString(fizzBuzz(start + 1, end)))
.replaceAll("\\]", "").split("\\[|,\\s*");
}
}发布于 2019-10-06 17:48:30
不清楚为什么要在一个返回语句中执行此操作,但如下所示:
return IntStream.range(start, end)
.mapToObj(i -> i % 15 == 0 ? "FizzBuzz" :
i % 3 == 0 ? "Fizz" : i % 5 == 0 ? "Buzz" : String.valueOf(i))
.toArray(String[]::new);IntStream.range通过增量步骤1将顺序有序的IntStream从start (包含)返回到end (独占),这完全适合您的命令式方法。mapToObj使我们能够将IntStream转换为Stream<String>。toArray使我们能够将Stream<String>转换为String[]以返回。您可以阅读更多关于IntStream API 这里的内容。
发布于 2019-10-06 19:04:46
注意:确保将FIZZBUZZ放在顶部,因为它是一个if语句,其中只有一个被执行。
public static String[] foo(int start, int end) {
return IntStream.range(start, end).mapToObj(i-> (
i%5==0 && i%3==0 ) ? "FIZZBUZZ":
i%3==0 ? "FIZZ":
i%5==0 ? "BUZZ":
String.valueOf(i)).toArray(String[]::new);
}https://stackoverflow.com/questions/58259733
复制相似问题