反转字符串:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
思路1(不采用库函数):采用双指针思路,分别从字符串的头和尾出发,交换字符元素。
思路2:库函数reverse,需要引入头文件<algrithem>
void reverseString(vector<char>& s) {
for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
swap(s[i],s[j]);
}
}
反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
class Solution {
public:
string AdvancedReverseString(string &s, int &k){
//vector<string>result;
for (int fast = 0; fast < s.size()-1; fast += 2 * k) {
// string sub = s.substr(slow, k);
reverse(s.begin()+fast,s.begin()+fast+k);
// result.insert(sub.begin(), sub.end());
if (s.size() - 1 - fast < k) { //如果剩余的长度不足k,则全部反转
//sub = s.substr(fast, s.size() - 1 - fast);
reverse(s.begin() + fast, s.end());
}
if (s.size() - 1 - fast < 2 * k && s.size() - 1 - fast > k) { //如果剩余的字符个数大于k,且小于2k,则反转前k个字符,其余的不变
//sub = s.substr(fast, k);
reverse(s.begin() + fast, s.begin() + fast + k);
}
}
for (int i = 0; i < s.size(); i++) {
cout << s[i] << endl;
}
return s;
}
};
反转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
class Solution {
public:
string ReverseWordinString(string& s) {
reverse(s.begin(), s.end());
/*for (auto val : s) {
cout << val;
}*/
int i = 0;
for (int j = 0; j < s.size(); j++) {
if (s[j] != ' ') {
continue;
}
if(s[j]==' '&&j>1) {
reverse(s.begin() + i + 1, s.begin() + j); //使用这个reverse(a,b)函数要注意以下问题(1)a,b必须类型相同,如果在容器内或者数组内,a,b必须为指针(2)s.end()为指向最后一个元素的下一个元素的指针,reverse()中的b要求是指向目标字符串的尾子符的指针(不是尾子符下一个的)
i = j;
}
}
/*for (int i=1;i<s.size()-1; i++) {
return s[i];
}*/
string sub = s.substr(1, s.size() - 2);
return sub;
}
};
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
class Solution {
public:
string ReverseWordinStringdobymyself(string& s, int k) {
reverse(s.begin(), s.end());
int slow = 0;
for (int fast = 0; fast < s.size(); fast++) {
if (fast >= k-1) {
++slow;
}
}
cout << slow << endl;
reverse(s.begin(), s.begin() +slow - 1);
reverse(s.begin() + slow, s.end());
return s;
}
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
reverse(s.begin(), s.end());
return s;
}
};
替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
class Solution {
public:
string ReplaceEmptyLattice(string& s) {
int count = 0;
for (auto val : s) {
if (val == ' ') {
count++;
}
}
//cout << count;
int sOldlength = s.size();
s.resize(s.size() + 2 * count);
int sNewlength = s.size();
// cout << s.size();
for (int j = sOldlength - 1, i = sNewlength - 1; i > j; i--, j--) {
if (s[j] != ' '){ //注意这里 ' '中间空格一下,' '代表两个空格
s[i]=s[j];
}
else {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
};