如何解决CodingBat中的递归代码错误?

时间:2019-09-16 16:58:35

标签: java recursion runtime-error testcase

所以,我正在CodingBat上解决此问题

  

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

     

changePi(“ xpix”)→“ x3.14x”

     

changePi(“ pipi”)→“ 3.143.14”

     

changePi(“ pip”)→“ 3.14p”

这是我的代码:

public String changePi(String str) {
    if (str.length() < 2)
        return str;
    char c1 = str.charAt(0);
    char c2 = str.charAt(1);
    if (c1 == 'p' && c2 == 'i')
        return "3.14" + changePi(str.substring(2));
    return c1 + c2 + changePi(str.substring(2));
}

此代码不适用于许多测试用例,如下图所示 enter image description here

我无法理解我的递归代码出了什么问题以及为什么它显示了这样的输出。谁能帮助我了解我做错了什么?

3 个答案:

答案 0 :(得分:1)

您的解决方案需要进行一些细微调整-当您同时找到pi时,您正确地跳过了2个字符以查看字符串的其余部分–您正在执行此操作与return "3.14" + changePi(str.substring(2));

但是,当您一起找到pi时,您需要更改逻辑以仅跳过一个字符而不是两个字符。所以代替这个:

return c1 + c2+ changePi(str.substring(2));

执行此操作:

return c1 + changePi(str.substring(1));

进行更改后,我得到以下输出(使用您的每个输入),这些输出与您的预期输出相匹配:

x3.14x
3.143.14
3.14p
3.14
hip
p
x

3.14xx
xyzzy

答案 1 :(得分:1)

以下是该问题的几种替代方法。第二个类似于您的方法。在第一个中,我最初包含了目标替换文本,因此我需要确定其长度。因此,我决定将其保留在setupFetchClient() { let httpClient = new HttpClient(); httpClient.configure(config => { config.withDefaults({ headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', } }) .withInterceptor({ request(request: Request) { let accessToken = getAccessToken(); request.headers.append('Authorization', 'Bearer ' + accessToken); return request; }, responseError(error) { return error; } }) .useStandardConfiguration(); }); // Aurelia Specific Code. Container.instance.registerInstance(HttpClient, httpClient); } 中。

"pi".length()

它们都打印以下内容。


       public static void main(String[] args) {
          String[] tests = {
                "piabcpiefgpi", "xxxxxxpix", "xpix", "pip", "3.14", "3.14p",
                "hip", "p", "x", "", "pixx", "xyzzy"
          };
          for (String t : tests) {
             System.out.println(t + " --> " + replaceV2(t));
          }
       }

       public static String replaceV1(String a) {
          int i = a.indexOf("pi");
          if (i < 0) {
             return a;
          }
          return replaceV1(
                a.substring(0, i) + "3.14" + a.substring(i + "pi".length()));
       }

       public static String replaceV2(String a) {
          if (a.length() < 2) {
             return a;
          }

          if (a.startsWith("pi")) {
             a = "3.14" + replaceV2(a.substring(2));
          }
          return a.substring(0, 1) + replaceV2(a.substring(1));
       }
    }

答案 2 :(得分:0)

'''  change pi to 3.14 python code'''

def changePi(s):
    if len(s) == 2 and s == 'pi' :  return '3.14'
    if len(s) <= 2 :  return s 
    chars , sub = s[0:2] , s[1:]
    if chars == 'pi':
       chars = '3.14'
       sub = sub[1:]
    else:  chars =  chars[0]
    return chars + changePi(sub) 

print changePi("xpix") 
print changePi("pipi") 
print changePi("pip")