2017-09-26 42 views
-1

我想将字符串拆分为三部分,并向后打印每个部分。所以当用户输入“HelloWorld”时,它应该打印“dlroWolleH”。我不知道我在哪里错了,它翻转像一对。将字符串拆分为三部分,并将递归应用于翻转:java

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; 
    }   
} 
+0

[什么是调试器以及它如何帮助我诊断问题? ](https://stackoverflow.com/q/25385173/5221149) – Andreas

+0

打印你的分割结果,你会发现你的错误:'HelloWorld'被分割成'Hel','loWo','orld'。哎呀! “世界”中的“o”包含两次。 – Andreas

+0

另外,如果输入长度为2个字符*(并且它将在递归之一中)*,则按原样返回它,而不反转它。哎呀! – Andreas

回答

0

也许你正在努力实现这个

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(); 
    } 
} 
+2

问题不在于如何反转字符串。它是测试程序员熟练使用递归算法的一项*任务*,并且可能会明确指出问题所在:它必须将输入拆分为3部分并翻转部分,然后必须使用递归来逆转每个部分。对我投下赞成票,因为答案对这个问题没有用处。 – Andreas

+0

为什么在新的StringBuilder.reverse()。toString()'会做到这一点时,你一次添加一个字符串? – Andreas

+0

检查更新后的代码,我认为这会解决您的问题 –

0

您有返回字符串不变的基本情况:

str.length()==2 

在这种情况下,你需要之前扭转串返回它。

+0

是的,但不是唯一的问题。看到我的意见质疑。 – Andreas

0

我相信这就是你要做的。

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; 
} 
+0

它仍然这样做。而不是“droroWolleH”这是给“ldroWolleH” – doey

0

这里我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); 
} 

但我不知道为什么我们需要滑分为3个部分,我们已经做的,用2份

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); 
} 
相关问题