华为OD机试 - 字符串分割(二) - 双指针(Python/JS/C/C++ 2024 C卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。
一、题目描述
给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
对于新组成的每一个子串,
- 如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
- 反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;
- 大小写字母的数量相等时,不做转换。
二、输入描述
输入为两行,第一行为参数K,第二行为字符串S。
三、输出描述
输出转换后的字符串。
四、测试用例
测试用例1
1、输入
3
12abc-abcABC-4aB@
2、输出
12abc-abc-ABC-4aB-@
3、说明
子串为12abc、abCABc、4aB@,第一个子串保留,
后面的子串每3个字符一组为abC、ABc、4aB、@,
abC中小写字母较多,转换为abc,
ABc中大写字母较多,转换为ABC,
4aB中大小写字母都为1个,不做转换,
@中没有字母,连起来即12abc-abc-ABC-4aB-@
测试用例2
1、输入
3
Test-aaBBcc-CCddEE
2、输出
Test-aab-bcc-CCD-DEE
3、说明
五、解题思路
题目很简单:
- 输入一行字符串,以-分隔
- 分隔的第一个字符串直接拼接,其余的字符串,每k个字符拼接一次,以-分隔
- 每k个字符截取一次,通过双指针截取即可,right - left = 3
六、Python算法源码
def convert_case(s: str) -> str:
# 统计大小写字母数量
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 s.lower()
elif upper_count > lower_count:
return s.upper()
return s
def process_string(k: int, s: str) -> str:
# 输入验证
if not s or k <= 0:
return s
# 分割字符串
parts = s.split('-')
if len(parts) <= 1:
return s
# 处理第一部分
result = [parts[0]]
remaining = ''.join(parts[1:])
# 按K个字符分组处理
for i in range(0, len(remaining), k):
group = remaining[i:i+k]
result.append(convert_case(group))
return '-'.join(result)
七、JavaScript算法源码
function convertCase(str) {
// 统计大小写字母数量
const lowerCount = (str.match(/[a-z]/g) || []).length;
const upperCount = (str.match(/[A-Z]/g) || []).length;
// 根据数量关系转换
if (lowerCount > upperCount) {
return str.toLowerCase();
} else if (upperCount > lowerCount) {
return str.toUpperCase();
}
return str;
}
function processString(k, s) {
// 输入验证
if (!s || k <= 0) return s;
// 分割字符串
const parts = s.split('-');
if (parts.length <= 1) return s;
// 处理第一部分
const result = [parts[0]];
const remaining = parts.slice(1).join('');
// 按K个字符分组处理
for (let i = 0; i < remaining.length; i += k) {
const group = remaining.slice(i, i + k);
result.push(convertCase(group));
}
return result.join('-');
}
八、C算法源码
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void convertCase(char* str) {
int lowerCount = 0, upperCount = 0;
int len = strlen(str);
// 统计大小写字母数量
for (int i = 0; i < len; i++) {
if (islower(str[i])) lowerCount++;
else if (isupper(str[i])) upperCount++;
}
// 根据数量关系转换
if (lowerCount > upperCount) {
for (int i = 0; i < len; i++) {
str[i] = tolower(str[i]);
}
} else if (upperCount > lowerCount) {
for (int i = 0; i < len; i++) {
str[i] = toupper(str[i]);
}
}
}
void processString(int k, char* s) {
if (!s || k <= 0) return;
char result[1000] = {0};
char* token = strtok(s, "-");
// 处理第一部分
strcpy(result, token);
strcat(result, "-");
// 合并剩余部分
char remaining[1000] = {0};
while ((token = strtok(NULL, "-"))) {
strcat(remaining, token);
}
// 按K个字符分组处理
int len = strlen(remaining);
char group[1000];
for (int i = 0; i < len; i += k) {
strncpy(group, remaining + i, k);
group[k] = '\0';
convertCase(group);
strcat(result, group);
if (i + k < len) strcat(result, "-");
}
strcpy(s, result);
}
九、C++算法源码
class Solution {
public:
static string processString(int k, string s) {
if (s.empty() || k <= 0) return s;
// 分割字符串
vector<string> parts;
stringstream ss(s);
string part;
while (getline(ss, part, '-')) {
parts.push_back(part);
}
if (parts.size() <= 1) return s;
// 处理第一部分
string result = parts[0];
string remaining;
for (size_t i = 1; i < parts.size(); i++) {
remaining += parts[i];
}
// 按K个字符分组处理
for (size_t i = 0; i < remaining.length(); i += k) {
result += "-";
string group = remaining.substr(i, k);
result += convertCase(group);
}
return result;
}
private:
static string convertCase(const string& str) {
int lowerCount = 0, upperCount = 0;
// 统计大小写字母数量
for (char c : str) {
if (islower(c)) lowerCount++;
else if (isupper(c)) upperCount++;
}
string result = str;
// 根据数量关系转换
if (lowerCount > upperCount) {
transform(result.begin(), result.end(), result.begin(), ::tolower);
} else if (upperCount > lowerCount) {
transform(result.begin(), result.end(), result.begin(), ::toupper);
}
return result;
}
};
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。