2017-09-26 56 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); 
}