#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