题解 | 字符串变形
字符串变形
https://www.nowcoder.com/practice/c3120c1c1bc44ad986259c0cf0f0b80e?tpId=295&tqId=44664&sourceUrl=%2Fexam%2Foj
class Solution {
public:
string trans(string s, int n) {
if (n == 0) return s;
// 第一步:反转整个字符串
reverse(s.begin(), s.end());
// 第二步:反转每个单词并改变大小写
int start = 0;
for (int i = 0; i <= n; i++) {
if (i == n || s[i] == ' ') {
// 反转当前单词
reverseWordAndToggleCase(s, start, i);
start = i + 1;
}
}
return s;
}
private:
void reverseWordAndToggleCase(string& s, int start, int end) {
// 反转单词内部的字符顺序
int left = start, right = end - 1;
while (left < right) {
swap(s[left], s[right]);
// 交换后分别改变大小写
s[left] = toggleCase(s[left]);
s[right] = toggleCase(s[right]);
left++;
right--;
}
// 处理中间字符(当单词长度为奇数时)
if (left == right) {
s[left] = toggleCase(s[left]);
}
}
char toggleCase(char c) {
if (c >= 'a' && c <= 'z') {
return c - 'a' + 'A';
} else if (c >= 'A' && c <= 'Z') {
return c - 'A' + 'a';
}
return c;
}
};
核心思想: 整体反转:先反转整个字符串,这样单词顺序就反了,但每个单词内部的字符顺序也反了 单词内部反转:再反转每个单词内部的字符顺序,恢复单词的正确顺序 大小写反转:在处理每个单词时同时反转字符的大小写 为什么这样处理空格正确: 原字符串开头的空格在整体反转后会跑到结尾 原字符串结尾的空格在整体反转后会跑到开头 单词之间的空格在反转过程中位置保持不变 时间复杂度:O(n)
数据类型之字符串 文章被收录于专栏
常用操作: 连接: + 运算符 重复: * 运算符 索引:索引访问单个字符,索引从0开始 切片:指定开始索引、结束索引和步长来获取子字符串 长度:len()获取长度 成员检查:in和not in检查子字符串是否存在于字符串中 方法:字符串对象有很多方法,如split, join, upper, lower, strip, replace 由于字符串是不可变的,所以不能通过索引直接修改字符串中的字符
查看38道真题和解析
腾讯音乐娱乐集团公司福利 285人发布