题目描述
输入字符串s,输出s中包含所有整数的最小和。
说明:
字符串s,只包含 a-z A-Z ± ;
合法的整数包括
- 正整数 一个或者多个0-9组成,如 0 2 3 002 102
- 负整数 负号(-) 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023
输入描述
包含数字的字符串
输出描述
所有整数的最小和
输入 | bb12-34aa |
---|---|
输出 | -31 |
说明 | 1+2+(-34) = -31 |
Python算法源码
import re
# 计算整数各个位数之和
def get_num_sum(num):
return sum(int(digit) for digit in num)
if __name__ == "__main__":
# 监听控制台输入
while True:
line = input()
num_arr = re.split(r'[^\d-]+', line)
res = 0
for num in num_arr:
if num:
if '-' not in num:
# 处理正整数
res += get_num_sum(num)
else:
# 处理负整数
is_neg = num.startswith('-')
sub_num_arr = num.split('-')拜拜
for i in range(len(sub_num_arr)):
if sub_num_arr[i]:
ele = int(sub_num_arr[i])
if i == 0:
res += -ele if is_neg else get_num_sum(sub_num_arr[i])
else:
res -= ele
print(res)
C语言算法源码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
// 计算整数各个位数之和
int getNumSum(const char *num) {
int sum = 0;
for (int i = 0; num[i] != '\0'; i++) {
sum += num[i] - '0';
}
return sum;
}
int main() {
char line[1000];
fgets(line, sizeof(line), stdin);
line[strcspn(line, "\n")] = '\0'; // 移除换行符
char *token;
int res = 0;
// 定义用于正则表达式分割的标记字符串
const char *delim = "[^0-9-]+";
// 使用strtok函数分割字符串
token = strtok(line, delim);
while (token != NULL) {
char *num = token;
if (strlen(num) > 0) {
if (strchr(num, '-') == NULL) {
// 处理正整数
res += getNumSum(num);
} else {
// 处理负整数
char *ptr = strtok(num, "-");
bool isNeg = false;
while (ptr != NULL) {
int ele = atoi(ptr);
if (!isNeg) {
res += ele;
isNeg = true;
} else {
res -= ele;
}
ptr = strtok(NULL, "-");
}
}
}
token = strtok(NULL, delim);
}
printf("%d\n", res);
return 0;
}
Java算法源码
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
// 计算整数各个位数之和
public static int getNumSum(String num) {
int sum = 0;
for (char c : num.toCharArray()) {
sum += Character.getNumericValue(c);
}
return sum;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine().trim();
Pattern pattern = Pattern.compile("-?\\d+");
Matcher matcher = pattern.matcher(line);
int res = 0;
while (matcher.find()) {
String num = matcher.group();
if (!num.isEmpty()) {
if (!num.contains("-")) {
// 处理正整数
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 ? -ele : getNumSum(subNumArr[i]);
} else {
res -= ele;
}
}
}
}
}
}
System.out.println(res);
}
}
4 条评论
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]