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