将字符串分成三部分,并将递归应用于flip:java
我试图将字符串分成三个部分,并将每个部分向后打印。因此,当用户输入“HelloWorld”时,它应该打印“dlroWolleH”。我不知道我错在哪里,它像一对翻转将字符串分成三部分,并将递归应用于flip:java,java,Java,我试图将字符串分成三个部分,并将每个部分向后打印。因此,当用户输入“HelloWorld”时,它应该打印“dlroWolleH”。我不知道我错在哪里,它像一对翻转 import java.util.*; public class recursion { public static void main(String args[]) { Scanner scanner = new Scanner (System.in); System.out.prin
import java.util.*;
public class recursion
{
public static void main(String args[])
{
Scanner scanner = new Scanner (System.in);
System.out.print("Enter a string: ");
String str = sc.nextLine();
System.out.print(revRec3(str));
}
public static String revRec3(String str)
{
if ((str.length() == 1)|| (str.length()==0 || str.length()==2))
{
return str;
}
String left = str.substring(0, (str.length() / 3)),
middle = str.substring((str.length()/3) ,(str.length()-left.length())),
right = str.substring((str.length()-middle.length()),str.length());
String revLeft = revRec3(left);
String revMiddle = revRec3(middle);
String revRight = revRec3(right);
return revRight + revMiddle + revLeft;
}
}
也许你正试图做到这一点
import java.util.Scanner;
public class Main {
public static void main(String args[])
{
Scanner sc = new Scanner (System.in);
System.out.print("Enter a string: ");
String str = sc.next();
System.out.print(revRec3(str));
}
public static String revRec3(String str)
{
if ((str.length() == 1)|| (str.length()==0 || str.length()==2))
{
return str;
}
String left = str.substring(0, (str.length() / 3)),
middle = str.substring((str.length()/3) ,(str.length()-left.length())),
right = str.substring((str.length()-middle.length()+1),str.length());
String revLeft = revRec(left);
String revMiddle = revRec(middle);
String revRight = revRec(right);
return revRight + revMiddle + revLeft;
}
private static String revRec(String middle) {
StringBuilder sb = new StringBuilder(middle);
return sb.reverse().toString();
}
}
您有一个返回字符串未更改的基本情况:
str.length()==2
在这种情况下,您需要在返回字符串之前反转字符串。我相信这就是您的目的
public static void main(String args[])
{
Scanner scanner = new Scanner (System.in);
System.out.print("Enter a string: ");
String str = sc.nextLine();
System.out.print(threeSplitString(str));
}
public static String threeSplitString(String str)
{
if (str.length() < 3)
{
return str;
}
int len = str.length();
String p1 = str.substring(len * 0 / 3, len * 1 / 3); // First Third
String p2 = str.substring(len * 1 / 3, len * 2 / 3); // Second Third
String p3 = str.substring(len * 2 / 3, len * 3 / 3); // Third Third
// The recursion
p1 = threeSplitString(p1);
p2 = threeSplitString(p2);
p3 = threeSplitString(p3);
return p3 + p2 + p1;
}
publicstaticvoidmain(字符串参数[])
{
扫描仪=新的扫描仪(System.in);
System.out.print(“输入字符串:”);
字符串str=sc.nextLine();
系统输出打印(三分字符串(str));
}
公共静态字符串threeSplitString(字符串str)
{
如果(str.length()<3)
{
返回str;
}
int len=str.length();
字符串p1=str.substring(len*0/3,len*1/3);//第一个三分之一
字符串p2=str.substring(len*1/3,len*2/3);//第二个第三个
字符串p3=str.substring(len*2/3,len*3/3);//第三个
//递归
p1=threeSplitString(p1);
p2=threeSplitString(p2);
p3=threeSplitString(p3);
返回p3+p2+p1;
}
这里是我的javascript代码,希望对您有所帮助
function rev(input) {
let len = input.length;
if(len < 2) return input;
if(len == 2) return input[1]+input[0];
let left = input.substring(0, Math.round(len/3))
let mid = input.substring(Math.round(len/3), Math.round(len-len/3))
let right = input.substring(Math.round(len-len/3), len)
return rev(right) + rev(mid) + rev(left);
}
功能版本(输入){
设len=input.length;
if(len<2)返回输入;
如果(len==2)返回输入[1]+输入[0];
设left=input.substring(0,数学四舍五入(len/3))
设mid=input.substring(Math.round(len/3),Math.round(len-len/3))
设right=input.substring(数学四舍五入(len-len/3),len)
返回转(右)+转(中)+转(左);
}
但我不知道为什么我们需要分为三个部分,我们已经有两个部分了
function rev(input) {
let len = input.length;
if(len < 2) return input;
if(len == 2) return input[1]+input[0];
let left = input.substring(0, Math.round(len/2));
let right = input.substring(Math.round(len/2), len);
return rev(right) + rev(left);
}
功能版本(输入){
设len=input.length;
if(len<2)返回输入;
如果(len==2)返回输入[1]+输入[0];
设left=input.substring(0,数学四舍五入(len/2));
设right=input.substring(数学四舍五入(len/2),len);
返回版本(右)+版本(左);
}
问题不在于如何反转字符串。这是一项测试程序员递归算法熟练程度的任务,可能会明确说明问题的确切含义:它必须将输入分成3部分,然后翻转这些部分,然后每个部分都必须使用递归进行反转。我投反对票,因为答案对这个问题没有用处。你到底为什么每次添加一个字符,而新的StringBuilder(s)却可以。reverse()。toString()可以吗?检查更新的代码,我认为这会解决你的问题。代码中仍然没有递归调用。似乎您不了解问题的范围,即什么是递归以及如何使用它。幸好你没有得到那份作业,因为你会失败。打印分割结果,你会发现错误:HelloWorld
被分割成Hel
,loWo
,orld
。哎呀!!World
中的o
包含两次。此外,如果输入长度为2个字符(并且将在其中一个递归上),则可以按原样返回,而不必反转。哎呀!!!没错,但不是唯一的问题。请看我对问题的评论。它仍在做同样的事情。不是“dlroWolleH”,而是“ldroWolleH”