返回目录
题目描述
给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;大小写字母的数量相等时,不做转换。
输入描述
输入为两行,第一行为参数K,第二行为字符串S。
输出描述
输出转换后的字符串。
示例:
输入 | 3 12abc-abCABc-4aB@ |
---|---|
输出 | 12abc-abc-ABC-4aB-@ |
说明 | 子串为12abc、abCABc、4aB@,第一个子串保留, 后面的子串每3个字符一组为abC、ABc、4aB、@, abC中小写字母较多,转换为abc, ABc中大写字母较多,转换为ABC, 4aB中大小写字母都为1个,不做转换, @中没有字母,连起来即12abc-abc-ABC-4aB-@ |
题目解析
此题应该就是考察字符串的操作能力的,只要熟练掌握字符串操作即可。
本题比较困惑的是,第一个子串是否要做大小写转换?看用例说明的意思,应该是不用做的。
下面代码中,我把大小写转换抽出成一个方法,考试时可以根据自行使用。
Python算法源码
def to_lower_case(s):
return s.lower()
def to_upper_case(s):
return s.upper()
def convert(s):
lower_count = sum(1 for c in s if c.islower())
upper_count = sum(1 for c in s if c.isupper())
if lower_count > upper_count:
return to_lower_case(s)
elif lower_count < upper_count:
return to_upper_case(s)
else:
return s
if __name__ == "__main__":
k = int(input()) # 读取k的值
s = input() # 读取字符串s
res = "" # 用于存储结果的字符串
new_str = "" # 用于存储重新合并的子串
# 如果第二行输入的开头是'-',则说明第一个字串是空串
first = s[0] != '-'
tokens = s.split("-") # 使用'-'分割字符串s为子串
for token in tokens:
if first:
# 第一个子串不做处理
# 看用例说明,对应第一个子串是不需要做大小写转换的,但是也拿不准,考试时可以都试下
res += token
first = False
else:
# 剩余子串重新合并为一个新字符串,每k个字符一组
new_str += token
i = 0
while i < len(new_str):
# 新字符串每k个字符一组
sub_str = new_str[i:i+k]
# 子串中小写字母居多,则整体转为小写字母,大写字母居多,则整体转为大写字母
res += "-" + convert(sub_str)
i += k
print(res) # 打印结果字符串
C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 将字符串转换为小写
void toLowerCase(char *s) {
int i = 0;
while (s[i] != '\0') {
if (s[i] >= 'A' && s[i] <= 'Z') {
s[i] += 32;
}
i++;
}
}
// 将字符串转换为大写
void toUpperCase(char *s) {
int i = 0;
while (s[i] != '\0') {
if (s[i] >= 'a' && s[i] <= 'z') {
s[i] -= 32;
}
i++;
}
}
// 根据大小写比较结果转换字符串大小写
void convert(char *s) {
int lowerCount = 0;
int upperCount = 0;
int i = 0;
while (s[i] != '\0') {
char c = s[i];
if (c >= 'a' && c <= 'z') lowerCount++;
else if (c >= 'A' && c <= 'Z') upperCount++;
i++;
}
if (lowerCount > upperCount) {
toLowerCase(s);
} else if (lowerCount < upperCount) {
toUpperCase(s);
}
}
// 获取结果字符串
char *getResult(int k, char *s) {
char *res = malloc(sizeof(char) * 1000); // 存储结果的字符串
memset(res, '\0', 1000);
char *arr[1000]; // 存储分割后的子串
char *token = strtok(s, "-");
int idx = 0;
while (token != NULL) {
arr[idx++] = token;
token = strtok(NULL, "-");
}
// 第一个子串不做处理
strcat(res, arr[0]);
// 剩余子串重新合并为一个新字符串,每k个字符一组
char newStr[1000] = {'\0'};
for (int i = 1; i < idx; i++) {
strcat(newStr, arr[i]);
}
// 每k个字符一组进行处理
for (int i = 0; i < strlen(newStr); i += k) {
char dest[k + 1]; // 存储每组字符
strncpy(dest, newStr + i, k);
dest[k] = '\0';
// 根据大小写情况进行转换
convert(dest);
strcat(res, "-");
strcat(res, dest);
}
return res;
}
int main() {
int k;
scanf("%d", &k); // 读取k的值
char str[1000];
scanf("%s", str); // 读取字符串s
printf("%s\n", getResult(k, str)); // 打印结果字符串
return 0;
}
Java算法源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt(); // 读取k的值
scanner.nextLine(); // 读取换行符
String str = scanner.nextLine(); // 读取字符串s
System.out.println(getResult(k, str)); // 打印结果字符串
}
public static String getResult(int k, String s) {
String[] arr = s.split("-");
StringBuilder res = new StringBuilder();
// 第一个子串不做处理
res.append(arr[0]);
// 剩余子串重新合并为一个新字符串,每k个字符一组
StringBuilder newStr = new StringBuilder();
for (int i = 1; i < arr.length; i++) {
newStr.append(arr[i]);
}
// 每k个字符一组进行处理
for (int i = 0; i < newStr.length(); i += k) {
String subStr = newStr.substring(i, Math.min(i + k, newStr.length()));
// 根据大小写情况进行转换
res.append("-").append(convert(subStr));
}
return res.toString();
}
public static String convert(String s) {
int lowerCount = 0;
int upperCount = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') lowerCount++;
else if (c >= 'A' && c <= 'Z') upperCount++;
}
if (lowerCount > upperCount) return s.toLowerCase();
else if (lowerCount < upperCount) return s.toUpperCase();
else return s;
}
}
3 条评论
[...]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提取字符串的最长合法简单数学表达式双指[...]