华为OD统一考试 -/求字符串中所有整数的最小和

题目描述

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

说明:

字符串s,只包含 a-z A-Z ± ;

合法的整数包括

1) 正整数 一个或者多个0-9组成,如 0 2 3 002 102

2)负整数 负号 – 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023

输入描述

包含数字的字符串

输出描述

所有整数的最小和

用例

输入

bb1234aa

输出

10

说明

输入

bb12-34aa

输出

-31

说明

1+2+(-34) = -31

题目解析

本题看上去很难,其实想清楚三点那就很简单

  • 正数字符串的最小值如何计算?比如1234的最小值是多少,那肯定是1+2+3+4,即每位都是一个独立数,且都是一个小于10的数,它们之和就是最小的。
  • 负数字符串的最小值如何计算?比如-34,那肯定是整体当成一个负数时,最小。
  • 正数负数混合字符串最小值如何计算?比如12-34,那肯定是正数部分12每位单独计算,负数部分当成整体

我的解题思路如下:

定义一个容器negative,用于存储负数的数字字符

定义一个标识isNegative,用来记录是否遇到负数,初始化为false,标识一开始没有遇到负数

遍历输入字符串s的每一个字符c

  • 如果 c == '-',则说明负数要开始了,因此更新isNegative = true
  • 如果 c 是数字字符,则此时需要分情况讨论:
  1. isNegative == false,则此时直接将c字符转成对应的数值合入结果,ans += parseInt(c)
  2. isNegative == true,则说明c是负数的字符,此时应该将c加入缓存容器negative中
  • 如果 c 是字母字母,若isNegative == true,则需要将negative容器中内容拼接,然后转化为负数合入结果,ans -= parseInt(negative.join("")),完成后,将isNeagtive = false,并且清空negative容器。

需要注意的是,当c == '-',也需要注意出现 “-34-40” 这种情况,即 c == '-',也需要先判断isNegative == true,则需要将negative容器中内容拼接,然后转化为负数合入结果,ans -= parseInt(negative.join("")),完成后,将isNeagtive = false,并且清空negative容器。


import Foundation
func ODTest_45() {
    print("输入描述")
    print("输入字符串s,输出s中包含所有整数的最小和")
    let reg = /([-]\d+)/
    var numExp = (readLine() ?? "")
    let characters = numExp.map { Character(String($0)) }

    var isNegative = false
    var data: [Character] = []
    var ans = 0
    for i in 0 ..< characters.count {
        let character = characters[i]
        if character >= Character("0") && character <= Character("9") {
            if isNegative == false {
                ans += Int(String(character)) ?? 0
            } else {
                data.append(character)
            }
            continue
        }

        if isNegative == true && !data.isEmpty {
            ans -= Int(data.map { String($0) }.joined()) ?? 0
            data.removeAll()
            isNegative = false
        }

        if character == Character("-") {
            isNegative = true
        }
    }

    if isNegative == true && !data.isEmpty {
        ans -= Int(data.map { String($0) }.joined()) ?? 0
        data.removeAll()
        isNegative = false
    }
    print("所有整数的最小和")
    print("\(ans)")
}

2024华为OD机试卷题 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务