#C63. 华为OD机试统一考试D卷C卷 - 求字符串中所有整数的最小和
华为OD机试统一考试D卷C卷 - 求字符串中所有整数的最小和
题目链接
华为OD机试统一考试D卷C卷 - 求字符串中所有整数的最小和(C++ Java JavaScript Python)
https://blog.csdn.net/banxia_frontend/article/details/134910880
题目描述
输入字符串s,输出s中包含所有整数的最小和。 说明: 字符串s,只包含 a-z A-Z ± ; 合法的整数包括
- 正整数 一个或者多个0-9组成,如 0 2 3 002 102
- 负整数 负号(-) 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023
输入描述
包含数字的字符串
输出描述
所有整数的最小和
用例1
输入
bb1234aa
输出
10
用例2
输入
bb12-34aa
输出
-31
说明
1+2+(-34) = -31
C++
#include <iostream>
#include <string>
#include <regex>
using namespace std;
// 计算整数各个位数之和
int getNumSum(string num) {
int sum = 0;
for (char c : num) {
sum += c - '0';
}
return sum;
}
int main() {
string line;
getline(cin, line);
// 用正则表达式分割出所有整数
regex reg("[^\\d-]+");
sregex_token_iterator it(line.begin(), line.end(), reg, -1);
sregex_token_iterator end;
int res = 0;
for (; it != end; ++it) {
string num = *it;
if (!num.empty()) {
if (num.find("-") == string::npos) {
// 处理正整数
res += getNumSum(num);
} else {
// 处理负整数
bool isNeg = num[0] == '-';
regex subReg("-");
sregex_token_iterator subIt(num.begin(), num.end(), subReg, -1);
int i = 0;
for (; subIt != end; ++subIt) {
string subNum = *subIt;
if (!subNum.empty()) {
int ele = stoi(subNum);
if (i == 0) {
res += isNeg ? 0 - ele : getNumSum(subNum);
} else {
res -= ele;
}
++i;
}
}
}
}
}
cout << res << endl;
return 0;
}
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
// 用正则表达式分割出所有整数
String[] numArr = line.split("[^\\d-]+");
int res = 0;
for (String num : numArr) {
if (!num.isEmpty()) {
if (num.indexOf("-") == -1) {
// 处理正整数
res += getNumSum(num);
} else {
// 处理负整数
boolean isNeg = num.startsWith("-");
String[] subNumArr = num.split("-");
for (int i = 0; i < subNumArr.length; i++) {
if (!subNumArr[i].isEmpty()) {
int ele = Integer.parseInt(subNumArr[i]);
if (i == 0) {
res += isNeg ? 0 - ele : getNumSum(subNumArr[i]);
} else {
res -= ele;
}
}
}
}
}
}
System.out.println(res);
}
// 计算整数各个位数之和
private static int getNumSum(String num) {
int sum = 0;
for (char c : num.toCharArray()) {
sum += Character.getNumericValue(c);
}
return sum;
}
}
javaScript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (line) => {
const numArr = line.split(/[^\d-]+/);
let res = 0;
for (const num of numArr) {
if (num) {
if (num.indexOf('-') === -1) {
res += getNumSum(num);
} else {
const isNeg = num.startsWith('-');
const subNumArr = num.split('-');
for (let i = 0; i < subNumArr.length; i++) {
if (subNumArr[i]) {
const ele = parseInt(subNumArr[i]);
if (i === 0) {
res += isNeg ? 0 - ele : getNumSum(subNumArr[i]);
} else {
res -= ele;
}
}
}
}
}
}
console.log(res);
});
function getNumSum(num) {
let sum = 0;
for (const c of num) {
sum += parseInt(c);
}
return sum;
}
python
import re
def getNumSum(num):
sum = 0
for c in num:
sum += int(c)
return sum
line = input()
numArr = re.findall(r'-?\d+', line)
res = 0
for num in numArr:
if num:
if '-' not in num:
res += getNumSum(num)
else:
isNeg = num.startswith('-')
subNumArr = num.split('-')
for i in range(len(subNumArr)):
if subNumArr[i]:
ele = int(subNumArr[i])
if i == 0:
res += -ele if isNeg else getNumSum(subNumArr[i])
else:
res -= ele
print(res)
C语言
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> // 用于isdigit函数
int main() {
char s[10001]; // 假定输入字符串不超过10000个字符
scanf("%s", s); // 读取字符串
long long res = 0;
for (int i = 0; s[i]; i++) {
if (!isdigit(s[i]) && s[i] != '-') continue; // 是其他字母,直接跳过
if (s[i] == '-') {
int j = i + 1;
long long num = 0;
while (isdigit(s[j])) {
num = num * 10 + s[j] - '0';
j++;
}
res -= num;
i = j - 1;
} else {
res += s[i] - '0';
}
}
printf("%lld\n", res);
return 0;
}
完整用例
用例1
bb1234aa
用例2
bb12-34aa
用例3
a1b2c3d4
用例4
abc-12-34def
用例5
a0b0c0d0
用例6
a1b2c3d4e5f6g7h8i9j10k11
用例7
a-1b-2c-3d-4e-5f-6g-7h-8i-9j-10k-11
用例8
aaa123aaa456aaa789
用例9
a1b2c3-4d5e6f7-8g9h10i11
用例10
a-1b-2c-3d-4e-5f-6g-7h-8i-9j-10k11 @[TOC]