反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = [“h”,“e”,“l”,“l”,“o”] 输出:[“o”,“l”,“l”,“e”,“h”] 示例 2:
输入:s = [“H”,“a”,“n”,“n”,“a”,“h”] 输出:[“h”,“a”,“n”,“n”,“a”,“H”]
双指针
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
length = len(s)
i = 0
j = length - 1
while i < j:
s[i], s[j] = s[j], s[i]
i = i + 1
j = j - 1
return s
C++版本
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
for (int i = 0, j = n-1; i < n/2; i++, j--){
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
};
541. 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2 输出:“bacdfeg” 示例 2:
输入:s = “abcd”, k = 2 输出:“bacd”
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
for (int i = 0; i < n; i += 2*k){
reverse(s.begin()+i, s.begin()+min(i+k, n));
}
return s;
}
};
557. 反转字符串中的单词 III
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = “Let’s take LeetCode contest” 输出:“s’teL ekat edoCteeL tsetnoc” 示例 2:
输入: s = “God Ding” 输出:“doG gniD”
直接原地一趟翻转每个单词
class Solution {
public:
string reverseWords(string s) {
int n = s.size();
int i = 0;
while (i < n){
int start = i;
while (i < n && s[i] != ' '){
i++;
}
int end = i - 1;
// cout << start << " " << end << endl;
while (start < end){
swap(s[start], s[end]);
start++;
end--;
}
while (i < n && s[i] == ' '){
i++;
}
}
return s;
}
};
NC89 字符串变形
描述 对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像”Hello World”一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如”Hello World”变形后就变成了”wORLD hELLO”。
字符串中包括大写英文字母、小写英文字母、空格。 进阶:空间复杂度 O(n)O(n) , 时间复杂度 O(n)O(n)
输入描述: 给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6) 返回值描述: 请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
示例1 输入: “This is a sample”,16 返回值: “SAMPLE A IS tHIS”
示例2 输入: “nowcoder”,8 返回值: “NOWCODER”
示例3 输入: “iOS”,3 返回值: “Ios”
两次翻转:先整体翻转,然后每个单词翻转
class Solution {
public:
string trans(string s, int n) {
reverse(s.begin(), s.end());
int i = 0, j = 0;
while (i < n){
j = i;
while (j < n && s[j] != ' '){
if (s[j] >='a' && s[j] <= 'z')
s[j] += 'A' - 'a';
else
s[j] -= 'A' - 'a';
j++;
}
reverse(s.begin()+i, s.begin()+j);
i = j + 1;
}
return s;
}
};