首页 > 解决方案 > 递归地用字符串中的 3.14 替换 pi(无循环)

问题描述

给定一个字符串,递归(无循环)计算一个新字符串,其中所有出现的“pi”都已替换为“3.14”。

changePi("xpix") → "x3.14x"
changePi("pipi") → "3.143.14"
changePi("pip") → "3.14p"

我的代码工作得很好,但是有没有其他方法(只有递归没有循环)来解决这个问题而不必创建一个新的字符串 str2 ?
提前谢谢你
这是我的代码:

    public  String changePi(String str) {
    String str2 = "";
    return changePi(str, str2);
}

public String changePi(String str, String str2) {
    if (str.length() == 0)
        return str2;

    else {
        if (str.endsWith("pi")) {
            str2 = 3.14 + str2;
            return changePi(str.substring(0, str.length() - 2), str2);
        } else
            str2 = str.charAt(str.length() - 1) + str2;

    }
    return changePi(str.substring(0, str.length() - 1), str2);

}

标签: java

解决方案


您正在犯与上一个问题中相同的错误。此外,我更愿意检查一个字符串是否以字符串开头,而不是以字符串结尾...我假设您想要一些您可以理解并且易于解释的东西。

  1. 你能匹配“pi”还是字符串已经小于长度(“pi”)符号 -> 不能做太多所以返回它。
  2. 它是否以“pi”开头?如果是这样,则返回与字符串的其余部分连接的替换(只是其余从第 0 个索引开始的length("pi")个字符...
  3. 如果它不是以“pi”开头,则将第一个字符与changePi的输出连接起来,并将字符串的其余部分作为输入。
public static String changePi(String str) {
    if (str.length() < "pi".length()) {
        return str;
    }

    if (str.startsWith("pi")) {
        return "3.14" + changePi(str.substring("pi".length(), str.length()));
    }

    return str.charAt(0) + changePi(str.substring(1, str.length()));
}

而且,如果您仍然喜欢使用“endsWith”逻辑,那么这里应用的算法相同。

public static String changePi(String str) {
    if (str.length() < "pi".length()) {
        return str;
    }

    if (str.endsWith("pi")) {
        return changePi(str.substring(0, str.length() - "pi".length())) + "3.14";
    }

    return changePi(str.substring(0, str.length() - 1)) + str.charAt(str.length() - 1);
}

推荐阅读