汇芳书院

专注计算机视觉、机器学习、分布式计算等领域, 兼聊投资、写作、生活

0%

反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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”]  


双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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++版本

1
2
3
4
5
6
7
8
9
10
11
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”  


1
2
3
4
5
6
7
8
9
10
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”


直接原地一趟翻转每个单词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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”


两次翻转:先整体翻转,然后每个单词翻转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
}
};
坚持原创分享,您的支持将鼓励我继续创作

欢迎关注我的其它发布渠道

------------- 本文结束,感谢阅读 如有问题可留言交流 -------------