CodingBat--递归编码

时间:2015-06-10 17:12:04

标签: java recursion tail-recursion

我正在尝试编码蝙蝠问题repeatFront:

  

给定一个字符串和一个int n,返回由前n个字符组成的字符串       字符串,后跟字符串的前n-1个字符,依此类推。您       可以假设n在0和字符串的长度之间(包括n)   = 0且n< = str.length())。

repeatFront("Chocolate", 4) → "ChocChoChC"
repeatFront("Chocolate", 3) → "ChoChC"
repeatFront("Ice Cream", 2) → "IcI"

以下是我正在尝试的代码:

public String repeatFront(String str, int n) {
    if(n==0) {
        return str;
    }
    sub = str.substring(0,n);
    sub = sub+repeatFront(sub,n-1);
    return sub;
}

我得到的错误是我的字符串末尾有一个额外的字符。第一个例子是“ChocChoChCC”和第二个“ChoChCC”等等。我只想在概念上知道我做错了什么以及如何解决它。

7 个答案:

答案 0 :(得分:3)

啊,我发现了你的问题。

如果str,您只能返回空字符串。

repeatFront(Ch, 1)repeatFront(C, 0)来回C时,n==0会再次返回该额外的最后一封信。

通过将return "";的回报更改为if(n==0) { return ""; } 来修复:

{{1}}

答案 1 :(得分:0)

这很有用 -

 public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    repeatFront("Chocolate", 4,sb);
    System.out.println(sb);
}

public static void repeatFront(String str, int n,StringBuilder sb) {
    if(n==0) {
        return;
    }
    sb.append(str.substring(0,n));
    repeatFront(str,n-1,sb);
}
}

问题 - 对于n = 0,您将返回sub,因为您获得了最后一个额外字符。我已经使用StringBuilder使它变得干净,并且还消除了为每次调用创建额外字符串对象的开销。

答案 2 :(得分:0)

你可以用这个:

public String repeatEnd(String str, int n) {
  if (n == 0)
  return "";

  String res = re(str, n);
  String resl ="";

  for (int i =0 ; i < n ; i ++){
    resl = resl + res;
  }
  return resl;
}
public String re(String s , int n){
  String end = "";

  int len = s.length();

  end = s.substring(len-n , len);

  return end;
}

答案 3 :(得分:0)

public String repeatFront(String str, int n) {
  //take a empty string
  String temp = "";
  //check if it greater then zero value of n
  while(n>0)
  {
//run a for loop and add the string data in temp string
  for(int i=0;i<=n;i++)
  {
    temp = temp + str.substring(0,n);
//decrement the n value after every for loop
    n--;
  }
  }
//now return the temp string
  return temp;
}

答案 4 :(得分:0)

    public String repeatFront(String str, int n) {
    String result="";
   if(str.length()==0){
   return "";
   }
   if(str.length()>=1){
     for(int i=n;i>=1;i--){enter code here
       String sub = str.substring(0,i);
       result = result + sub;
     }

   return result;
 }

答案 5 :(得分:0)

您也可以使用此功能。

public String repeatFront(String str, int n){

    int i;
    String result = "";
    for(i=n; 0<i; i--){
        result += str.substring(0,i);
    }
    return result;
}

答案 6 :(得分:0)

您也可以使用 Java 11 String.repeat()

public String repeatEnd(String str, int n) {
    return str.substring(str.length() - n).repeat(n);
}