华为OD机试真题---求字符串中所有整数的最小和

一、题目描述

输入字符串s,输出s中包含所有整数的最小和。

说明

字符串s,只包含 a-zA-Z±;
合法的整数包括
1)正整数 一个或者多个0-9组成,如023 002 102
2)负整数负号-开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023

二、输入描述

包含数字的字符串

三、输出描述

所有整数的最小和
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入
bb1234aa
输出
10
说明
1+2+3+4=10

示例2 输入输出示例仅供调试,后台判题数据一般不包含示例

输入
bb12-34aa
输出
-31
说明
1+2+(-34)=-31

四、解题思路:

  1. 正则表达式匹配

    • 使用正则表达式来匹配字符串中的合法整数。
    • 正整数的正则表达式:[1-9]\d*0(但考虑到题目中的示例和常规理解,我们可能不希望单独匹配 0 作为正整数,除非它是数字的一部分,如 023,但这里我们假设 023 是不合法的,只匹配 123 这样的正整数)。
    • 负整数的正则表达式:-[1-9]\d*-0(但同样地,我们可能不希望匹配单独的 -0,只匹配如 -123 这样的负整数)。
    • 注意:由于题目说明中允许 023002 这样的表示(尽管它们在数学上不是标准的八进制或十进制表示),我们需要调整正则表达式以匹配这些情况,但在这里我们假设只匹配标准的十进制表示,即不以 0 开头的多位数(除非它是 0 本身,但单独一个 0 不应被视为正整数的一部分)。
  2. 提取整数

    • 使用正则表达式在字符串中查找所有匹配的整数。
    • 将匹配的整数转换为实际的整数类型(如 int)以便进行计算。
  3. 计算和

    • 初始化一个变量来存储整数的和。
    • 遍历所有提取的整数,将它们累加到和中。
  4. 处理最小和的问题

    • 题目要求的是“最小和”,但在常规理解下,从字符串中提取的整数直接求和就是它们的和,不存在“最小”的概念(除非有负数参与,使得总和可能更小)。
    • 在这里,“最小和”可能意味着对提取的整数不进行任何额外的数学操作(如取绝对值、排序等),直接求和即可,因为题目没有提供其他关于如何获得“最小和”的明确指示。
    • 如果字符串中包含负数,那么求和的结果自然可能是负数,这就是“最小和”在这个上下文中的含义(即所有整数的算术和)。
  5. 实现细节

    • 在实现时,需要注意正则表达式的精确性,以确保只匹配合法的整数。
    • 需要处理可能的异常情况,如字符串中没有整数的情况。

五、代码实现


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringSmallestSum {
    public static void main(String[] args) {
        // 示例测试
        String input1 = "bb1234aa";
        System.out.println(findIntegersSum(input1));  // 输出:10

        String input2 = "bb12-34aa";
        System.out.println(findIntegersSum(input2));  // 输出:-31
    }

    public static int findIntegersSum(String s) {
        // 定义正则表达式来匹配合法的整数
        // \\d 匹配一个数字
        // [+-]?\\d+ 匹配一个可选的正号或负号,后跟一个或多个数字
        String regex = "\\d|[+-]?\\d+";

        // 编译正则表达式并创建匹配器
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(s);

        int sum = 0;

        // 遍历所有匹配的整数
        while (matcher.find()) {
            // 将匹配的整数转换为整数类型并累加到总和中
            sum += Integer.parseInt(matcher.group());
        }

        return sum;
    }
}

解释:
  1. 正则表达式

    • \\b:单词边界,确保我们匹配的是完整的整数。
    • [+-]?:可选的正号或负号。
    • (?:0*[1-9]\\d*|0+):非捕获组,用于匹配数字部分。
      • 0*[1-9]\\d*:一个或多个非零数字前面可能有零。
      • 0+:单独的零或多个零(虽然题目说明中未明确提到单独的零是否为合法整数,但根据常见理解,我们将其包括在内)。
  2. Pattern和Matcher

    • Pattern.compile(regex):编译正则表达式。
    • matcher.find():在输入字符串中查找所有匹配的整数。
    • matcher.group():返回当前匹配的整数字符串。
  3. 求和

    • 使用Integer.parseInt()将匹配的整数字符串转换为整数类型。
    • 将转换后的整数累加到总和中。

六、注意

  • 题目中提到的“包含所有整数的最小和”实际上是指所有整数的总和,因为题目并未要求找到所有可能的子集并计算它们的最小和(这是一个NP完全问题)。
  • 上述代码已经处理了前导零的情况,例如“0023”会被正确解析为23。
  • 负数也被正确处理,例如“-0023”会被解析为-23(注意,虽然输入中“-0”是合法的,但根据整数的常规表示,它会被解析为0)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值