Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决这个问题;重复分隔符“;Java中没有循环的问题?_Java - Fatal编程技术网

如何解决这个问题;重复分隔符“;Java中没有循环的问题?

如何解决这个问题;重复分隔符“;Java中没有循环的问题?,java,Java,有一个叫CodingBat的问题 我知道如何解决这个问题,但我的解决方案和我在互联网上找到的大多数解决方案都使用循环。有没有一种不用循环就能解决这个问题的方法 我需要的伪代码返回(word+rep)*计数哪种方法不起作用,但有没有办法达到类似的效果 我非常重视任何回复 如果您只是想避免使用循环,只需执行递归即可。 由于这是一种例外,我将简要概述一个解决方案 要找到问题的递归解决方案,首先必须找到基本情况。 用分隔符连接字符串的问题有两种基本情况 把这个词重复零次 把这个词重复一遍 现在,要创

有一个叫CodingBat的问题

我知道如何解决这个问题,但我的解决方案和我在互联网上找到的大多数解决方案都使用循环。有没有一种不用循环就能解决这个问题的方法

我需要的伪代码
返回(word+rep)*计数哪种方法不起作用,但有没有办法达到类似的效果


我非常重视任何回复

如果您只是想避免使用循环,只需执行递归即可。 由于这是一种例外,我将简要概述一个解决方案

要找到问题的递归解决方案,首先必须找到基本情况。 用分隔符连接字符串的问题有两种基本情况

  • 把这个词重复零次
  • 把这个词重复一遍

现在,要创建一个递归解决方案,您必须以某种方式减少大小写重复单词
n
次,以重复单词
m
次,其中
m
如果您绝对想在实现中隐藏循环,您可以执行以下操作:

public String repeatSeparator(String word, String separator, int count) {
    return IntStream.range(0, count)
        .mapToObj(i -> word)
        .collect(Collectors.joining(separator));
}
上面的代码生成0到count-1之间的数字,用给定的字替换每个数字,最后用给定的分隔符连接它们

注意,这仍然使用循环,它们只是隐藏在流中。更糟糕的是,这种解决方案几乎肯定比天真的StringBuilder+for解决方案效率低

编辑:相同想法的(可能)更简单版本:

public String repeatSeparator(String word, String separator, int count) {
    return Stream.generate(() -> word)
        .limit(count)
        .collect(Collectors.joining(separator));
}

创建一个无限的单词流,将其限制在给定的计数范围内,然后用分隔符将它们连接起来。

您可以通过组合使用以下方法/函数来完成此操作:

  • 演示:

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            // Tests
            System.out.println(repeatSeparator("Word", "X", 3));
            System.out.println(repeatSeparator("This", "And", 2));
            System.out.println(repeatSeparator("This", "And", 1));
        }
    
        static String repeatSeparator(String word, String separator, int n) {
            String[] arr = new String[n];
            Arrays.fill(arr, word);
            return String.join(separator, arr);
        }
    }
    
    WordXWordXWord
    ThisAndThis
    This
    
    输出:

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            // Tests
            System.out.println(repeatSeparator("Word", "X", 3));
            System.out.println(repeatSeparator("This", "And", 2));
            System.out.println(repeatSeparator("This", "And", 1));
        }
    
        static String repeatSeparator(String word, String separator, int n) {
            String[] arr = new String[n];
            Arrays.fill(arr, word);
            return String.join(separator, arr);
        }
    }
    
    WordXWordXWord
    ThisAndThis
    This
    
    如果允许您使用Java11,您可以按如下方式使用:

    static String repeatSeparator(String word, String separator, int n) {
        return (word + separator).repeat(n - 1) + word;
    }
    

    一个使用Java 11的线性程序:

    String repeatSeparator(String word, String sep, int count) {
        return (word + sep).repeat(count-1) + word;
    }
    
    一个使用Java 8的线性程序:

    String repeatSeparator(String word, String sep, int count) {
        return String.join(sep, Collections.nCopies(count, word));
    }
    

    一个包含
    Collections.nCopies的解决方案

    String repeatSeparator(String word, String separator, int count) {
        return Collections.nCopies(count, word).stream()
                .collect(Collectors.joining(separator));;
    }
    

    如注释和@ackdari的回答中所述,您可以使用递归。我建议采用以下方法:


    虽然时间复杂度似乎是
    O(lgn)
    ,但情况并非如此,除非对字符串的操作(复制、连接)是原子的。这个代码可能比其他示例的代码慢。

    就像许多其他问题一样,没有固定时间的解决方案。也许有办法让它运行得更快,但它仍然是O(N)。递归怎么样?即使有一些奇特的语法来编写它,它也不会是
    O(1)
    循环只是隐藏的,如果有办法避免循环,但仍然有O(N)的复杂性,那很好!!Java的哪个版本?几乎在每个新版本中,方法都添加到类
    String
    。你会考虑使用Apache的<代码> StrugUTLIs<代码>类或其他类似的第三方库吗?我以前从未使用过java 11,它看起来像是与其他回复相比作弊,但这确实是我一直在寻找的!最后,你得到了你应得的荣誉。我觉得很开心,下载了Java11并进行了测试;工作很好;谢谢大家!@unobatbayar我还为Java8添加了一个版本,以防您想使用Java8。这太疯狂了