CodingBat sumNumbers

时间:2016-02-20 18:44:01

标签: java string

对于此问题:http://codingbat.com/prob/p121193

我写了这段代码:

public int sumNumbers(String str) {
  int y = 0;
  int z = 0;
  for (int f4 = 0; f4 < str.length(); f4++) {
    if (Character.isDigit(str.charAt(f4))) {
      for (int f5 = f4; f5 < str.length(); f5++) {
        if (!Character.isDigit(str.charAt(f5))) {
          z = (Integer.parseInt(str.substring(f4, f5)));
          y = y + z;
          f4 = f5 - 1;
          break;
        }
      }
    }
  }
  return y;
}

这些是问题(它们不是代码,但拒绝接受我的问题):

sumNumbers("abc123xyz") Expected: 123; Returned: 123
sumNumbers("aa11b33") Expected: 44; Returned: 11
sumNumbers("7 11") Expected: 18; Returned: 7
sumNumbers("Chocolate") Expected: 0; Returned: 0
sumNumbers("5hoco1a1e") Expected: 7; Returned: 7
sumNumbers("5$$1;;1!!") Expected: 7; Returned: 7
sumNumbers("a1234bb11") Expected: 1245; Returned: 1234
sumNumbers("") Expected: 0; Returned: 0
sumNumbers("a22bbb3") Expected: 25; Returned: 22

总而言之,由于某些原因,我的代码无法处理超过一位数的多个数字,我不知道为什么。我一直在打开和关闭这个问题,虽然我拒绝直接查找答案,但我真的可以使用一些帮助。 我在高中AP Comp。科学。

6 个答案:

答案 0 :(得分:1)

您的代码没有任何问题。唯一的问题是您没有正确处理边界条件。您正在检查是否aa11b33。现在,如果你的内心疲惫而且没有遇到这种情况怎么办?

例如,如果测试用例失败,则最后一个或最后几个字符是整数。

请参阅此33。现在,y将永远不会添加到您的总和中,即if,因为您的public int sumNumbers(String str) { int y = 0, z = 0, f4, f5 = 0; for (f4 = 0; f4 < str.length(); f4++) { if (Character.isDigit(str.charAt(f4))) { for (f5 = f4; f5 < str.length(); f5++) { if (!Character.isDigit(str.charAt(f5))) { z = (Integer.parseInt(str.substring(f4, f5))); y = y + z; f4 = f5; break; } } /* Handle Boundary Conditions */ if (f4 != f5) { z = (Integer.parseInt(str.substring(f4, str.length()))); y = y + z; break; } } } return y; } 条件永远不会被执行而内部会被耗尽。

您需要处理边界条件以识别这些有效输入,然后将它们添加到总和中。

以下是供参考的更正代码段:

{{1}}

答案 1 :(得分:1)

以下是您修改的代码,用于处理在String末尾找到有效数字的情况。我认为你可以重构一下,将重复的逻辑提取到一个方法中,并且只计算一次str.length()。但在这里它会返回您期望的结果:

    public int sumNumbers(String str) {
      int y = 0;
      int z = 0;

      for (int f4 = 0; f4 < str.length(); f4++) {
        Character c = str.charAt(f4);
        if (Character.isDigit(c)) {
          for (int f5 = f4; f5 < str.length(); f5++) {
            Character c2 = str.charAt(f5);

            if (!Character.isDigit(c2)) {
              z = (Integer.parseInt(str.substring(f4, f5)));
              y+= z;
              f4 = f5 - 1;
              break;
            }
            else if(Character.isDigit(c2) && f5 == str.length() -1){
                z = Integer.parseInt(str.substring(f4 ,str.length()));
                y += z;
                f4 = f5;
                break;
            }
          }
        }
      }
      return y;
    }

答案 2 :(得分:0)

分析输出,我们清楚地看到输入字符串最末端的数字被忽略。在末尾具有非数字的所有字符串都被正确解析 - 例如“5 $$ 1 ;; 1 !!”总计最多7个。

查看内部for循环,它查找已经识别的数字的长度,我们可以看到循环在内部条件语句有机会总结之前结束。

解决方案是简单地将求和特征移出内循环:

public static int sumNumbers(String str) {
    int sum = 0;
    for (int start = 0; start < str.length(); start++) {
        if (Character.isDigit(str.charAt(start))) {
            int end;
            for (end = start; end < str.length(); end++) {
                if (!Character.isDigit(str.charAt(end))) {
                    break;
                }
            }
            sum += (Integer.parseInt(str.substring(start, end)));
            start = end - 1;
        }
    }
    return sum;
}

请注意,我稍微重命名了一些变量,以使它们更具可读性。

总结的另一种方法是使用regular expression。我提到这一点是因为for循环看起来非常复杂,而且这个任务的正则表达式非常易读。

// \d+ means numbers with a minimum of 1 character
// (...) makes it a group that can be referred to later
private static Pattern NUMBERS = Pattern.compile("(\\d+)");

public static int sumNumbers(String str) {
    Matcher matcher = NUMBERS.matcher(str);
    int sum = 0;
    while (matcher.find()) {
        sum += Integer.parseInt(matcher.group());
    }
    return sum;
}

答案 3 :(得分:0)

您的解决方案根本不处理字符串末尾的数字。我会建议这样的解决方案:

int y = 0;
int z = 0;
for (int f4 = 0; f4 < str.length(); f4++) {
    int f5 = 0;
    // forward while digits found
    for (f5 = f4; f5 < str.length() && Character.isDigit(str.charAt(f5)); f5++);
    // if found at least one digit parse it
    if(f5 > f4){
        z = (Integer.parseInt(str.substring(f4, f5)));
        y = y + z;
        f4 = f5 - 1;
    }
}
return y;

答案 4 :(得分:0)

public int sumNumbers(String str) {
    int y = 0;
    int z = 0;
    for (int f4 = 0; f4 < str.length(); f4++) {
        if (Character.isDigit(str.charAt(f4))) {
            for (int f5 = f4; f5 < str.length(); f5++) {
                if (!Character.isDigit(str.charAt(f5))) {
                    z = (Integer.parseInt(str.substring(f4, f5)));
                    y = y + z;
                    z = 0;
                    f4 = f5;
                    break;
                }
                if (!Character.isDigit(str.charAt(f5)) || f5 == (str.length() - 1)) {
                    z = (Integer.parseInt(str.substring(f4, f5 + 1)));
                    y = y + z;
                    z = 0;
                    f4 = f5;
                    break;
                }
            }
        }
    }
    return y;
}

答案 5 :(得分:0)

问题也可以用另一种方式解决。

 public int sumNumbers(String str) {
  int result=0;
  int firstPosOfDig=0;
  int LastPosOfDig=0;

  for(int i=0; i<str.length();i++)
  {
    if(Character.isDigit(str.charAt(i)))
    {
      if(i==0 || !Character.isDigit(str.charAt(i-1)))
        firstPosOfDig=i;
      if(i==str.length()-1 || !Character.isDigit(str.charAt(i+1)))
        {
          LastPosOfDig=i;
          result+=Integer.parseInt(str.substring( firstPosOfDig, LastPosOfDig+1));
        }
    }
  }
  return result;
}