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

Codingbat挑战:sumNumbers流API解决方案

羊刚捷
2023-03-14

给定来自CodingBat的任务sumNumbers sumNumbers:

给定一个字符串,返回字符串中出现的数字之和,忽略所有其他字符。数字是一行中一个或多个数字字符的序列。(注意:Character.isDigit(char)测试字符是否为字符“0”、“1”、…、'9'. 整数parseInt(string)将字符串转换为int.)

sumNumbers("abc123xyz") → 123
sumNumbers("aa11b33") → 44
sumNumbers("7 11") → 18

我对这个问题的解决方案如下:

public int sumNumbers(String str) {
  int sum = 0;
  
  java.util.regex.Matcher matcher = java.util.regex.Pattern.compile("[0-9]+").matcher(str);
    while (matcher.find()) {
        sum += Integer.parseInt(matcher.group());
    }
    
  return sum;
}

是否可以使用流API解决此问题?

共有3个答案

东方琪
2023-03-14

String[] data = { "abc123xyz", "aa11b33", "7 11" };
  • <代码>\\D-除非数字串以外的任何字符串上拆分
Arrays.stream(data).map(
        str -> new AbstractMap.SimpleEntry<String, Integer>(
                str,
                Arrays.stream(str.split("\\D+"))
                        .filter(s -> !s.isBlank())
                        .mapToInt(Integer::parseInt).sum()))
        .forEach(e -> System.out.printf("%-10s -> %d%n",
                e.getKey(), e.getValue()));

印刷品

abc123xyz  -> 123
aa11b33    -> 44
7 11       -> 18

如果您只想得到总数,可以执行以下操作:

public static int getSum(String str) {
    return Arrays.stream(str.split("\\D+"))
                .filter(s -> !s.isBlank())
                .mapToInt(Integer::parseInt)
                .sum();
}

微生欣怡
2023-03-14

你们这些疯子。对我来说,你可以将任何函数转换为流。Map/Reduce是一种常见的模式:

int s = Stream.of("abc123xyz").mapToInt(str->{
    int sum = 0;

    java.util.regex.Matcher matcher = java.util.regex.Pattern.compile("[0-9]+").matcher(str);
    while (matcher.find()) {
        sum += Integer.parseInt(matcher.group());
    }

    return sum;
}).sum();
System.out.println(s);
林礼骞
2023-03-14

是否可以使用流API解决此问题?

使用.拆分("\\D")按不包含数字的子字符串拆分给定字符串。Regex"\\D"匹配由一个或多个非数字字符组成的字符串。结果将是一个数字字符串数组。

在数组上创建流并过滤掉非空字符串。然后使用mapToInt()将字符串解析为int,并将其作为终端操作应用。

此解决方案通过CodingBat上的所有测试:

public int sumNumbers(String str) {
    return Arrays.stream(str.split("\\D+"))
        .filter(s -> !s.isEmpty())
        .mapToInt(Integer::parseInt)
        .sum();
}

测试:

 类似资料:
  • 给定CodingBat中的任务sameEnds: 如果数组开头和结尾的数字组相同,则返回true。例如,对于,n=0和n=2的endpoint相同,n=1和n=3的endpoint相同。您可以假设n在0范围内。。nums。长度(含)。 我对这个问题的解决方案通过了绝大多数测试,但不是所有测试: 我的问题如下: 如何修复我的解决方案 是否可以使用流API解决此任务

  • 给定来自CodingBat的zeroFront notAlone任务: 返回一个数组,该数组包含与给定数组完全相同的数字,但重新排列以使所有零都在数组的开头分组。非零数字的顺序并不重要。因此变为。您可以修改并返回给定数组或制作一个新数组。 我对这个问题的解决方案在某些情况下会抛出ArrayIndexOutOfBoundsException: 我的问题如下: 如何解决我的问题? 如何使用Stream

  • 给定CodingBat中的任务notAlone: 如果数组中的元素前后都有值,并且这些值与它不同,那么我们会说它是“单独的”。返回给定数组的一个版本,其中给定值的每个单独实例都被其左侧或右侧较大的值替换。 我对这个问题的解决方案通过了绝大多数测试,但不是所有测试: 我的问题如下: 如何解决我的问题? 是否可以使用Stream API解决此任务? 测试结果

  • 给定CodingBat的任务镜像: 给定一个字符串,请在给定字符串的开头和结尾处查找镜像(向后)字符串。 换句话说,在给定字符串的最开始,以及在字符串的最末尾以相反的顺序(可能重叠)出现零个或多个字符。例如,字符串具有镜像结尾。 示例: 我对此任务的解决方案如下: 是否可以使用Stream API解决此问题?

  • 我正在尝试解决hackerrank中的一个“几乎已排序”的挑战。问题是: 给定一个包含元素的数组,可以只使用以下操作之一按升序对该数组进行排序吗? 交换两个元素。反转一个子段。 输入格式 第一行包含一个整数,指示数组的大小。 下一行包含以空格分隔的整数。 样本输入#1 2 4 2 示例输出 #1 是< br >交换1 2 示例输入 #2 3 3 1 2 样品输出#2 不 示例输入 #3 6 1 5