【华为OD-E卷 - 求字符串中所有整数的最小和 100分(python、java、c++、js、c)】
题目
输入字符串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
输出:
bb12-34aa
说明 1+2+(-34) = -31
python解法
- 解题思路:
- 这段代码实现了一个字符串处理算法,用于从输入字符串中解析出所有的数字,并根据其符号(正号或负号)计算一个最终的最小和。具体步骤如下:
解析字符串中的字符:逐一检查每个字符,判断是数字还是非数字。
处理负号和正号:
如果遇到数字并且处于负号后,累积到一个列表中,稍后解析为负数。
如果遇到数字并且处于非负号状态,则直接加到总和中。
处理负数累积逻辑:
每次遇到非数字字符时,检查是否存在累积的负数。如果有,将其从总和中减去。
返回结果:遍历结束后,返回总和,考虑最后可能存在的未处理负数。
s = input() # 输入一个字符串
# 解析负数函数,将收集的负数字符串列表解析为整数
def parse_negative(neg_digits):
if len(neg_digits) > 0: # 如果负数字符列表非空
return int("".join(neg_digits)) # 将字符拼接成字符串,再转为整数
return 0 # 如果列表为空,返回0
# 算法入口:从输入字符串计算最小和
def find_min_sum(input_str):
is_neg = False # 标记当前是否在处理负数
neg_num = [] # 用于存储当前负数的数字部分
total = 0 # 用于存储最终的总和
# 遍历输入字符串中的每一个字符
for idx, char in enumerate(input_str):
if char.isdigit(): # 如果字符是数字
if is_neg: # 如果前面有负号
neg_num.append(char) # 将数字字符加入负数列表
else: # 如果前面没有负号
total += int(char) # 直接将数字加到总和中
else: # 如果字符不是数字
if is_neg: # 如果正在处理负数
total -= parse_negative(neg_num) # 将负数累积值从总和中减去
neg_num.clear() # 清空负数列表,准备处理下一个
is_neg = (char == '-') # 更新是否为负数标记
# 遍历结束后,检查是否还有未处理的负数
if is_neg:
total -= parse_negative(neg_num)
return total # 返回最终计算的总和
# 输出最终计算结果
print(find_min_sum(s))
java解法
- 解题思路
- 这段代码的目标是从一个字符串中解析出所有的数字,根据其符号(正号或负号)计算一个最终的和。代码使用了 BigInteger 类型来处理可能出现的任意长度的大数字。具体步骤如下:
解析字符:逐一遍历字符串中的每个字符,判断是否为数字。
处理正负符号:
如果数字前面有负号,将数字累积到一个缓冲区,稍后作为负数处理。
如果数字前面没有负号,则直接加到总和中。
管理数字缓冲区:
遇到非数字字符时,检查缓冲区是否有未处理的负数。如果有,将缓冲区的内容从总和中减去。
遇到新负号时重置缓冲区,准备解析下一个负数。
结果输出:遍历完成后,返回总和。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // 读取输入
System.out.println(getResult(sc.nextLine())); // 调用方法处理输入字符串并输出结果
}
// 计算字符串中所有数字的和(考虑正负符号)
public static String getResult(String s) {
boolean isNegative = false; // 标记当前数字是否为负数
StringBuilder numberBuffer = new StringBuilder(); // 用于存储当前解析的数字
BigInteger sum = BigInteger.ZERO; // 用于存储最终结果(初始化为0)
// 遍历字符串中的每个字符
for (int i = 0; i < s.length(); i++) {
char currentChar = s.charAt(i); // 当前字符
if (Character.isDigit(currentChar)) { // 如果当前字符是数字
if (isNegative) { // 如果处于负号状态
numberBuffer.append(currentChar); // 将数字添加到缓冲区
} else { // 如果是正数
sum = sum.add(new BigInteger(String.valueOf(currentChar))); // 直接加到总和中
}
} else { // 如果当前字符不是数字
sum = updateSumAndResetBuffer(isNegative, numberBuffer, sum); // 更新总和并清空缓冲区
isNegative = currentChar == '-'; // 判断当前字符是否是负号,更新标记
}
}
// 遍历结束后,检查是否有未处理的负数
sum = updateSumAndResetBuffer(isNegative, numberBuffer, sum);
return sum.toString(); // 将最终结果转为字符串返回
}
// 更新总和并重置数字缓冲区
private static BigInteger updateSumAndResetBuffer(boolean isNegative, StringBuilder numberBuffer, BigInteger sum) {
if (isNegative && numberBuffer.length() > 0) { // 如果缓冲区有未处理的负数
sum = sum.subtract(new BigInteger(numberBuffer.toString())); // 将负数从总和中减去
numberBuffer.setLength(0); // 清空缓冲区
}
return sum; // 返回更新后的总和
}
}
C++解法
- 解题思路
更新中
C解法
更新中
JS解法
更新中
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏