Codingbat递归练习(java)

时间:2015-01-02 23:27:38

标签: java string recursion

如何以递归方式解决此问题而不是使用replace方法?我试图改进递归方法。

给定一个字符串,递归计算(无循环)一个新的字符串,其中所有的小写字母' x'字符已更改为' y'字符。

changeXY("codex") → "codey"
changeXY("xxhixx") → "yyhiyy"
changeXY("xhixhix") → "yhiyhiy"

我以这种方式欺骗并解决了它,并试图查看Java String方法替换的源代码,但我并不理解它。这是我的方法。

public String changeXY(String str) {
  int len = str.length();
  int i = 0;
  String changedStr = str.replace("x","y");


  if (len == 0)
    return str;

  return changedStr;

}

关于如何以递归方式进行操作的任何想法?

这是一项我不知道如何做的奖金练习。谢谢你的帮助!!!

给定一个字符串,递归计算一个新的字符串,其中所有的' x'字符已被删除。

noX("xaxb") → "ab"
noX("abc") → "abc"
noX("xx") → ""

8 个答案:

答案 0 :(得分:4)

递归几乎总是由两件事组成:

停止递归的条件。

假设我们可以解决一个较小的问题,如何使用这个假设来解决当前问题。

public String changeXY(String str) {

  // when to stop
  if (str.length() == 0){
    return str;
  }

  // handle the "special case" using an assumption we can solve str.substring(1)
  if (str.charAt(0) == 'x'){
    return 'y' + changeXY(str.substring(1));
  }
  // handle the "simple" case using an assumption we can solve str.substring(1)
  return str.charAt(0) + changeXY(str.substring(1));
}

一旦你意识到这是如何运作的,其他练习就很容易。

答案 1 :(得分:2)

伪代码:

  changeXY(input) {
    if (input.isEmpty()) return "";
    head = "firstChar"(input);
    tail = "theRest"(input);
    return (head == 'x' ? 'y' : head) + changeXY(tail);
  }


  noX(input) {
    if (input.isEmpty()) return "";
    head = "firstChar"(input);
    tail = "theRest"(input);
    return (head == 'x' ? '' : head) + noX(tail);
  }

您所要做的就是实现或调用适当的Java API而不是“firstChar”和“theRest”。我相信这将是小菜一碟;)

答案 2 :(得分:2)

递归基于两件事: 1-基本情况:这将阻止方法在某种条件下调用自身 2-操作:你想用这个方法做什么+再次调用方法,改变它的参数以达到基本情况。 在这种情况下,您必须执行以下操作

public String changeXY(String string){

    string = string.toLowerCase();
    if(string.length()==0)
    { 
        return string;
    }
    else if (str.charAt(0) == 'x')
    {
        return 'y' + changeXY(str.substring(1));
    }

    return str.charAt(0) + changeXY(str.substring(1)); 
}

答案 3 :(得分:0)

第一次练习:

public String changeXY(String str) {
      int len = str.length();
      String changedStr = "";
      for(int i=0; i<len; i++){
          if(str.charAt(i) == 'x'){
              changedStr+="y";
          }else{
              changedStr+=str.charAt(i);
          }
      }

      if (len == 0)
        return str;

      return changedStr;

}

如果是“x”,则更改为y,直到字符串终止。

第二个练习更简单:只需将changedStr+="y"部分更改为continue java指令。

但是,此代码不适合初学者。它要求您一般了解循环。如果你是学生,我真的建议你检查其他答案。他们更容易理解并掌握。

答案 4 :(得分:0)

希望我的回答能说明所有问题:)

public String changeXY(String str) {
  if (str.length() == 0) return ""; // return empty string if we reached the end of string
  String count = str.substring(0,1); // get the current string
  if (str.substring(0, 1).equals("x")) count = "y"; // if its x then replace it with y 
  // attach it to our final string and make recursive call passing string past the read character
  return count + changeXY(str.substring(1)); 
}

答案 5 :(得分:0)

仅在给定字符串中存在“ x”的地方进入递归。 进行递归调用,直到所有“ x”都变为“ y”。

public String changeXY(String str) {
  if(str.contains("x")){
    int idx = str.indexOf("x");
    return changeXY(str.substring(0,idx) + "y" + str.substring(idx+1, str.length()));
  }
  else return str;
}

答案 6 :(得分:-1)

python代码
def changeXY(s):
    if len(s) == 1 and s == 'x' : return 'y'
    if len(s) == 1 : return s
    char,sub = s[0:1],s[1:]       
    if char == 'x' :  char = 'y'  
    return char + changeXY(sub)

答案 7 :(得分:-1)

第一次练习...

public String changeXY(String str) {
  if(str.length() == 0) return str;
  if(str.charAt(0) == 'x') return 'y' + changeXY(str.substring(1, str.length()));
  return str.charAt(0) + changeXY(str.substring(1, str.length()));
}

第二次练习...

public String noX(String str) {
  if(str.length() == 0) return str;
  if(str.charAt(0) == 'x') return "" + noX(str.substring(1));
  return str.charAt(0) + noX(str.substring(1)); 
}