#P3049. 求字符串中所有整数的最小和(100分)
-
1000ms
Tried: 128
Accepted: 56
Difficulty: 1
所属公司 :
华为od
-
算法标签>模拟
求字符串中所有整数的最小和(100分)
题面描述
输入字符串 s,输出 s 中包含所有整数的最小和。
思路
思路
- 遍历字符串:逐个字符遍历输入字符串,识别出所有合法的整数。
- 识别整数:
- 正整数:每个单独的数字字符(
0-9)被视为一个正整数。 - 负整数:负号
-后跟连续的数字字符被视为一个负整数。
- 正整数:每个单独的数字字符(
- 提取整数:
- 当遇到数字字符时,累加其数值。
- 当遇到负号
-时,检查后续是否有数字字符,若有,则将连续的数字字符作为一个负整数处理。
- 求和:将所有提取到的整数进行求和,得到最终的结果。
代码分析
- 变量初始化:
sum用于存储最终的和。i为当前遍历的位置索引。n为字符串的长度。
- 遍历字符串:
- 使用循环遍历字符串的每个字符。
- 如果当前字符是负号
-,检查后续是否有数字字符,若有,则提取连续的数字作为一个负整数并累加到sum中。 - 如果当前字符是数字,则将其转换为整数并累加到
sum中。 - 其他字符跳过。
- 边界处理:
- 确保在提取负整数时,负号后确实跟有数字。
- 处理字符串末尾的数字。
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin >> s;
long long sum = 0; // 使用长整型防止溢出
int n = s.length();
int i = 0;
while(i < n){
// 检查是否是负数
if(s[i] == '-'){
int j = i + 1;
// 确保负号后面有数字
if(j < n && isdigit(s[j])){
string num_str = "-";
while(j < n && isdigit(s[j])){
num_str += s[j];
j++;
}
// 转换为整数并累加
sum += stoll(num_str);
i = j;
}
else{
// 负号后没有数字,跳过
i++;
}
}
// 检查是否是正数
else if(isdigit(s[i])){
// 每个数字字符视为单独的正整数
sum += (s[i] - '0');
i++;
}
else{
// 其他字符,跳过
i++;
}
}
cout << sum;
}
python
import sys
def main():
s = sys.stdin.read().strip()
total = 0
i = 0
n = len(s)
while i < n:
if s[i] == '-':
j = i + 1
# 检查负号后是否有数字
if j < n and s[j].isdigit():
num_str = '-'
while j < n and s[j].isdigit():
num_str += s[j]
j += 1
total += int(num_str)
i = j
else:
i += 1
elif s[i].isdigit():
# 每个数字字符视为单独的正整数
total += int(s[i])
i += 1
else:
i += 1
print(total)
if __name__ == "__main__":
main()
java
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
long sum = 0; // 使用长整型防止溢出
int n = s.length();
int i = 0;
while(i < n){
if(s.charAt(i) == '-'){
int j = i + 1;
// 检查负号后是否有数字
if(j < n && Character.isDigit(s.charAt(j))){
StringBuilder numStr = new StringBuilder("-");
while(j < n && Character.isDigit(s.charAt(j))){
numStr.append(s.charAt(j));
j++;
}
sum += Long.parseLong(numStr.toString());
i = j;
}
else{
i++;
}
}
else if(Character.isDigit(s.charAt(i))){
// 每个数字字符视为单独的正整数
sum += (s.charAt(i) - '0');
i++;
}
else{
i++;
}
}
System.out.println(sum);
}
}
题目描述
输入字符串 s ,输出 s 中包含所有整数的最小和。
说明:
字符串 s ,只包含 a−z A−Z ±
合法的整数包括
1)正整数:一个或者多个 0−9 组成,如 0 2 3 002 102
2)负整数:负号 – 开头,数字部分由一个或者多个 0−9 组成,如 −0 −012 −23 −00023
输入描述
包含数字的字符串
输出描述
所有整数的最小和
样例1
输入
bb1234aa
输出
10
样例2
输入
bb12-34aa
输出
-31
说明
1+2+(−34)=−31