求字符串中所有整数的最小和
求字符串中所有整数的最小和
真题目录: 点击去查看
E 卷 100分题型
题目描述
输入字符串s,输出s中包含所有整数的最小和。
字符串s,只包含 a-z A-Z ± ;
合法的整数包括
- 正整数 一个或者多个0-9组成,如 0 2 3 002 102
- 负整数 负号 – 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023
输入描述
包含数字的字符串
输出描述
所有整数的最小和
用例1
输入
bb1234aa
输出
10
说明
1 + 2+ 3+ 4= 10
示例二
输入
bb12-34aa
输出
-31
说明
1+2+(-34) = -31
题解
思路:
- 找到字符串中的整数,不包含- 号把每一个数字字符当成一个数,
123
看作 1 2 3 ,遇到- 时尽可能贪心取更多数量的数。
c++
#include<iostream>
#include<vector>
#include<string>
#include <utility>
#include <sstream>
#include<algorithm>
using namespace std;
int main() {
string s;
cin >> s;
// 防止超int范围
long long res = 0;
// 是否包含前置-
bool flag = false;
// 当包含负号时贪获取更多数字的字符串
string tmp = "";
for (int i = 0; i < s.size(); i++) {
if (s[i] == '+' || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z') || s[i] == '-') {
if (tmp != "") {
if (tmp != "-") {
res += stol(tmp);
}
flag = false;
tmp = "";
}
if (s[i] == '-') {
flag = true;
tmp = "-";
}
} else {
// 贪心获取更多数
if (flag) {
tmp += s[i];
} else {
//正整数单个作为一个值
res += (s[i] - '0');
}
}
}
// 处理末尾边界情况
if (tmp != "") {
if (tmp != "-") {
res += stol(tmp);
}
}
cout << res;
return 0;
}
JAVA
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 negative = new StringBuilder();
// int ans = 0;
BigInteger ans = new BigInteger("0");
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') {
if (isNegative) {
negative.append(c);
} else {
// ans += Integer.parseInt(c + "");
ans = ans.add(new BigInteger(c + ""));
}
} else {
if (isNegative && negative.length() > 0) {
// ans -= Integer.parseInt(negative.toString());
ans = ans.subtract(new BigInteger(negative.toString()));
negative = new StringBuilder();
}
isNegative = c == '-';
}
}
if (negative.length() > 0) {
// ans -= Integer.parseInt(negative.toString());
ans = ans.subtract(new BigInteger(negative.toString()));
}
return ans.toString();
}
}
Python
# 输入获取
s = input()
# 算法入口
def getResult():
isNegative = False
negative = []
ans = 0
for c in s:
if '0' <= c <= '9':
if isNegative:
negative.append(c)
else:
ans += int(c)
else:
if isNegative and len(negative) > 0:
ans -= int("".join(negative))
negative.clear()
isNegative = c == '-'
if len(negative) > 0:
ans -= int("".join(negative))
return ans
# 算法调用
print(getResult())
JavaScript
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
console.log(getResult(line));
});
function getResult(s) {
let isNegative = false;
const negative = [];
// let ans = 0;
let ans = BigInt(0);
for (let c of s) {
if (c >= "0" && c <= "9") {
if (isNegative) {
negative.push(c);
} else {
// ans += parseInt(c);
ans += BigInt(c);
}
} else {
if (isNegative && negative.length > 0) {
// ans -= parseInt(negative.join(""));
ans -= BigInt(negative.join(""));
negative.length = 0;
}
isNegative = c == "-";
}
}
if (negative.length > 0) {
// ans -= parseInt(negative.join(""));
ans -= BigInt(negative.join(""));
}
return ans.toString();
}
Go
package main
import (
"fmt"
"strconv"
"unicode"
)
func main() {
var s string
fmt.Scan(&s)
res := int64(0) // 结果
tmp := "" // 用于累积数字的字符串
flag := false // 标记是否包含前置 '-'
for _, char := range s {
if char == '+' || unicode.IsLetter(char) || char == '-' {
if tmp != "" {
if tmp != "-" {
if num, err := strconv.ParseInt(tmp, 10, 64); err == nil {
res += num
}
}
tmp = ""
flag = false
}
if (char == '-') {
flag = true
tmp = "-"
}
} else {
if flag {
tmp += string(char)
} else {
res += int64(char - '0')
}
}
}
// 处理末尾剩余部分
if tmp != "" {
if tmp != "-" {
if num, err := strconv.ParseInt(tmp, 10, 64); err == nil {
res += num
}
}
}
fmt.Println(res)
}