华为OD机试 - 求字符串中所有整数的最小和 - 逻辑分析(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

字符串s,只包含 a-z A-Z ± ;合法的整数包括

  1. 正整数 一个或者多个0-9组成,如 0 2 3 002 102
  2. 负整数 负号 – 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023

二、输入描述

包含数字的字符串。

三、输出描述

所有整数的最小和。

输入 输出 说明
bb1234aa 10 1+2+3+3=10
b12-34aa -31 1+2+(-34) = -31

四、解题思路

题读百遍,其义自见。

  1. 输入一个包含数字的字符串;
  2. 求出字符串中所有数字之和的最小值

比如:

b12-34aa
1+2+(-34) = -31就是最小值。

也就是说,如果是整数,直接相加,如果是负数,拼接成最小负数,再相加即可。

简单。

解题思路:

核心思想:如果是整数,直接相加,如果是负数,拼接成最小负数,再相加即可。

  1. 输入一行只包含字母、数字、符号-的字符串;
  2. 如果当前字符是-,表示负数的开始;
  3. 定义一个StringBuilder,用于拼接最小负数;
  4. 定义一个集合list,存储最小整数和最小负数;
  5. 如果是负数,为保证数字之和最小,需要拼接最小负数;
    • 如果是数字,继续拼接负数;
    • 如果不是数字,则表示最大负数拼接完毕,下次重新拼接;
  6. 如果是正数,为保证数字之和最小,直接拼接;
  7. 通过java8 Stream表达式(简洁/方便/上档次)快速求数字list之和;
  8. 输出所有整数的最小和。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        // 拼接最小负数
        StringBuilder negativeBuilder = new StringBuilder();
        // 包含最小正整数、最小负数
        List<String> list = new ArrayList<>();
        // 是否是负数
        boolean negativeFlag = false;
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            // 负数标识符
            if(c=='-'){
                negativeFlag = true;
                negativeBuilder.append("-");
                continue;
            }

            // 如果是负数,为保证数字之和最小,需要拼接最小负数
            if(negativeFlag){
                // 如果是数字,继续拼接负数
                if(Character.isDigit(c)) {
                    negativeBuilder.append(c);
                }else{// 如果不是数字,则表示最大负数拼接完毕,下次重新拼接
                    list.add(negativeBuilder.toString());
                    negativeFlag = false;
                    negativeBuilder = new StringBuilder();
                }
            }else {// 如果是正数,为保证数字之和最小,直接拼接
                if(Character.isDigit(c)){
                    list.add(String.valueOf(c));
                }
            }
        }

        System.out.println(list);

        int sum = list.stream().mapToInt(Integer::parseInt).sum();
        System.out.println(sum);
    }
}

六、效果展示

1、输入

b12-34aA1C79-3A

2、输出

-17

3、说明

获取最小整数和最小负数。

[1, 2, -34, 1, 7, 9, -3]

求其和为-17

华为OD机试 - 求字符串中所有整数的最小和 - 逻辑分析(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,开发语言,学习方法)