首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java FizzBuzz 1线

Java FizzBuzz 1线
EN

Stack Overflow用户
提问于 2019-10-06 17:35:59
回答 4查看 1.3K关注 0票数 0

如何用返回语句来完成Codingbat中的FizzBuzz练习?

我上次用来解决这个问题的代码是:

代码语言:javascript
运行
复制
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;
}

我的目标是拥有如下代码:

代码语言:javascript
运行
复制
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。

测试用例

代码语言:javascript
运行
复制
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"]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-06 19:55:24

在没有任何Java 8特性的情况下,我能想象的唯一方法是将数组转换为字符串,将字符串数组转换为字符串数组,其中有些非常.语用正则表达式但我想无论如何解决方案都不是很好。虽然它通过了所有的测试用例,所以它实现了通过测试驱动的开发所能达到的所有目标.

在现实生活中,永远不要写任何与此类似的东西!

代码语言:javascript
运行
复制
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*");
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-10-06 17:48:30

不清楚为什么要在一个返回语句中执行此操作,但如下所示:

代码语言:javascript
运行
复制
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);
  1. IntStream.range通过增量步骤1将顺序有序的IntStreamstart (包含)返回到end (独占),这完全适合您的命令式方法。
  2. mapToObj使我们能够将IntStream转换为Stream<String>
  3. toArray使我们能够将Stream<String>转换为String[]以返回。

您可以阅读更多关于IntStream API 这里的内容。

票数 4
EN

Stack Overflow用户

发布于 2019-10-06 19:04:46

  1. 确保您有JDK 8(否则此代码将无法工作)
  2. 使用IntStream.range,您可以生成整数。一旦你有了一叠数字,你就必须相应地绘制它们的地图。(在本例中,我们必须将它们映射到字符串[]中,并检查多个3、多个5和多个3&5),对于其他使用String.valueof()的数字,我们可以将它们添加到数组中。

注意:确保将FIZZBUZZ放在顶部,因为它是一个if语句,其中只有一个被执行。

代码语言:javascript
运行
复制
    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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58259733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档