题目描述
给定一个非空字符串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-@ |
输入 | 12 12abc-abCABc-4aB@ |
输出 | 12abc-abCABc4aB@ |
说明 |
子串为12abc、abCABc、4aB@,第一个子串保留, 后面的子串每12个字符一组为abCABc4aB@, 这个子串中大小写字母都为4个,不做转换, 连起来即12abc-abCABc4aB@ |
题目解析
此题应该就是考察字符串的操作能力的,只要熟练掌握字符串操作即可。
本题比较困惑的是,第一个子串是否要做大小写转换?看用例说明的意思,应该是不用做的。
下面代码中,我把大小写转换抽出成一个方法,考试时可以根据自行使用。
Java算法源码
import java.util.Scanner;
import java.util.StringJoiner;
public class Main {
static int[] fact;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
String s = sc.next();
System.out.println(getResult(k, s));
}
public static String getResult(int k, String s) {
String[] arr = s.split("-");
// 第一个子串不做处理
StringJoiner sj = new StringJoiner("-");
// sj.add(convert(arr[0])); // 看用例说明,对应第一个子串是不需要做大小写转换的,但是也拿不准,考试时可以都试下
sj.add(arr[0]);
// 剩余子串重新合并为一个新字符串,每k个字符一组
StringBuilder sb = new StringBuilder();
for (int i = 1; i < arr.length; i++) sb.append(arr[i]);
String newStr = sb.toString();
for (int i = 0; i < newStr.length(); i += k) {
String subStr = newStr.substring(i, Math.min(i + k, newStr.length()));
// 子串中小写字母居多,则整体转为小写字母,大写字母居多,则整体转为大写字母
sj.add(convert(subStr));
}
return sj.toString();
}
public static String convert(String str) {
int lowerCount = 0;
int upperCount = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c >= 'a' && c <= 'z') lowerCount++;
else if (c >= 'A' && c <= 'Z') upperCount++;
}
if (lowerCount > upperCount) return str.toLowerCase();
else if (lowerCount < upperCount) return str.toUpperCase();
else return str;
}
}
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 2) {
let k = parseInt(lines[0]);
let s = lines[1];
console.log(getResult(s, k));
lines.length = 0;
}
});
function getResult(s, k) {
const arr = s.split("-");
const ans = [];
// ans.push(convert(arr[0]));// 看用例说明,对应第一个子串是不需要做大小写转换的,但是也拿不准,考试时可以都试下
ans.push(arr[0]);
// 剩余子串重新合并为一个新字符串,每k个字符一组
const newStr = arr.slice(1).join("");
for (let i = 0; i < newStr.length; i += k) {
const subStr = newStr.slice(i, i + k);
// 子串中小写字母居多,则整体转为小写字母,大写字母居多,则整体转为大写字母
ans.push(convert(subStr));
}
return ans.join("-");
}
function convert(s) {
let lowerCount = 0;
let upperCount = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] >= "a" && s[i] <= "z") lowerCount++;
else if (s[i] >= "A" && s[i] <= "Z") upperCount++;
}
if (lowerCount > upperCount) return s.toLowerCase();
else if (lowerCount < upperCount) return s.toUpperCase();
else return s;
}
Python算法源码
# 输入获取
k = int(input())
s = input()
def convert(s):
lowerCount = 0
upperCount = 0
for c in s:
if 'z' >= c >= 'a':
lowerCount += 1
elif 'Z' >= c >= 'A':
upperCount += 1
if lowerCount > upperCount:
return s.lower()
elif lowerCount < upperCount:
return s.upper()
else:
return s
# 算法入口
def getResult():
arr = s.split("-")
ans = []
# ans.append(convert(arr[0])) # 看用例说明,对应第一个子串是不需要做大小写转换的,但是也拿不准,考试时可以都试下
ans.append(arr[0])
# 剩余子串重新合并为一个新字符串,每k个字符一组
newStr = "".join(arr[1:])
for i in range(0, len(newStr), k):
subStr = newStr[i:i + k]
# 子串中小写字母居多,则整体转为小写字母,大写字母居多,则整体转为大写字母
ans.append(convert(subStr))
return "-".join(ans)
# 算法调用
print(getResult())
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0