当前位置: 首页 > 知识库问答 >
问题:

编码数

卫招
2023-03-14

对于这个问题: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。Sci。

共有3个答案

白嘉石
2023-03-14

通过分析输出,我们可以清楚地看到输入字符串末尾的数字被忽略。所有结尾非数字的字符串都被正确解析,例如“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;
}

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

另一种求和方法是使用正则表达式。我之所以提到这一点,是因为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;
}
钱旻
2023-03-14

下面是修改后的代码,用于处理在字符串末尾找到有效数字的情况。我确实认为你可以重构一点,将重复的逻辑提取到一个方法中,并且只计算一次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;
    }
孙绍辉
2023-03-14

你的代码没有问题。唯一的问题是没有正确处理边界条件。您正在检查是否(!Character.isDigit(str.charAt(f5))。现在,如果你的内心已经精疲力竭,并且没有遇到这种情况呢?

例如,在测试用例失败的情况下,最后或最后几个字符是整数。

看到这个,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;
}
 类似资料:
  • 问题内容: 我正在工作的项目是使用Jackson JSON 序列化程序将一堆Java对象转换为String,以便将它们发送到REST服务。 其中一些对象包含敏感数据,因此我编写了自定义序列化程序以将这些对象序列化为JSON字符串,然后对其进行gzip,然后使用; 对其进行加密。 这会将字符串转换为字节数组,因此我在编解码器中使用Base64编码器将字节数组转换为字符串。REST接口背后的自定义反序

  • 任何HTML或XML文档都有自己的编码方式,比如ASCII 或 UTF-8,但是使用Beautiful Soup解析后,文档都被转换成了Unicode: markup = "<h1>Sacr\xc3\xa9 bleu!</h1>" soup = BeautifulSoup(markup) soup.h1 # <h1>Sacré bleu!</h1> soup.h1.string # u'Sacr\

  • 任何HTML或XML文档都有自己的编码方式,比如ASCII 或 UTF-8,但是使用Beautiful Soup解析后,文档都被转换成了Unicode: markup = "<h1>Sacr\xc3\xa9 bleu!</h1>" soup = BeautifulSoup(markup) soup.h1 # <h1>Sacré bleu!</h1> soup.h1.string # u'Sacr\

  • 在我们真正开始去写代码之前,我们可能会去考虑一些事情。怎么去规划我们的任务,如何去细分这个任务。 如果一件事可以自动化,那么就尽量去自动化,毕竟你是一个程序员。 快捷键!快捷键!快捷键! 使用可以帮助你快速工作的工具——如启动器。 不过不得不提到的一点是:你需要去考虑这个需求是不是一个坑的问题。如果这是一个坑,那么你应该尽早的去反馈这个问题。沟通越早,成本越低。 编码过程 整个编程的过程如下图所示

  • 注: 内容翻译来自官网资料 Encoding. 这封文档描述protocol buffer消息的二进制格式. 在应用中使用protocol buffer不需要理解这些, 但是它对于了解不同的protocol buffer格式对编码消息的大小的影响非常有用. 简单消息 假设你有下面这个非常简单的消息定义: message Test1 { required int32 a = 1; } 在应用中

  • 编码要闻 所谓编码,是因为我们要把汉字,英文单词等,转化为二进制的数字,因为计算机只认识数字。 最开始的编码是ascii,当时还只能储存英文和某些字符,但是因为中国等其它国家并不使用英语,所以我们开始有了自己的编码,但是这个时候就出现了问题,因为它会不能避免的出现一些重合的东西,这个时候就出现了乱码,然后世界开始使用了unicode,不过它有个缺点就是它总是两个字节的储存东西,所以会造成资源的浪费