在java中使用递归反转字符串
我想把一整根绳子倒过来。例如,Cat正在运行时应给出输出running is Cat 我已经尝试了很多,但是我做不到。它显示gninnur SITAC。请帮助我,它应该把猫作为一个单一的字符,而不是把“c”作为一个单一的字符 代码如下:在java中使用递归反转字符串,java,recursion,substring,reverse,Java,Recursion,Substring,Reverse,我想把一整根绳子倒过来。例如,Cat正在运行时应给出输出running is Cat 我已经尝试了很多,但是我做不到。它显示gninnur SITAC。请帮助我,它应该把猫作为一个单一的字符,而不是把“c”作为一个单一的字符 代码如下: public static void main(String[] args) { String str = "Cat is running"; System.out.println("Before recursion: " + str);
public static void main(String[] args) {
String str = "Cat is running";
System.out.println("Before recursion: " + str);
System.out.println("After recursion: " + reverse(str));
}
public static String reverse(String str) {
if(str.isEmpty())
return str;
String s = "";
for(int i = 0; i < str.length(); i++) {
s = s + str.charAt(i);
}
return reverse(s.substring(1)) + s.charAt(0);
}
您必须找到字符串中的第一个单词,将字符串的其余部分传递给递归调用,并在末尾追加第一个单词:
public static String reverse(String str) {
if(str.isEmpty() || !str.contains(" "))
return str;
int sep = str.indexOf(' ');
return reverse(str.substring(sep+1)) + " " + str.substring(0,sep);
}
输出:
Before recursion: Cat is running
After recursion: running is Cat
顺便说一句,循环是你的原始代码是没有意义的。您可以直接使用str,而不是创建它的副本
您可以通过以下方式将其缩短:
public static String reverse(String str) {
int sep = str.indexOf(' ');
return sep >= 0 ? reverse(str.substring(sep+1)) + " " + str.substring(0,sep) : str;
}
我想我让它比@Eran差了一点,但我已经写了:
private static String reverse(String str) {
if (str.isEmpty() || !str.contains(" "))
return str;
StringBuilder sb = new StringBuilder(" ");
int i = 0;
while (i < str.length() && str.charAt(i) != ' ') {
sb.append(str.charAt(i));
i++;
}
return reverse(str.substring(i + 1)) + sb.toString();
}
你能证明这些说法是正确的吗!str.contais和str.indexOf“”。我无法理解它。这些语句中实际发生了什么?@Yahya如果字符串不包含空格,则表示它只有一个单词,不应反转。因此,这是一个错误!str.contains检查。一旦知道字符串在空间列表中的位置,我们就使用indexOf“”来定位第一个空间的索引。然后我们使用子字符串将第一个单词与字符串的其余部分分开。我们将字符串的其余部分传递给下一个递归调用,然后在末尾附加一个空格+第一个单词。