Leetcode344(反转字符串)
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路解析:
双指针交换字符,对于字符串,我们定义两个指针,一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
代码及注释详解:
void reverseString(vector<char>& s) {
//头尾指针
int left = 0;
int right = s.size() - 1;
char temp;
//循环交换
while (left < right) {
//异或交换法
s[left] = s[left] ^ s[right];
s[right] = s[left] ^ s[right];
s[left] = s[left] ^ s[right];
//向之间靠拢
left++;
right--;
}
}
Leetcode541(反转字符串II)
题目描述:
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
思路解析:
将字符串分成许多个长度为2k的子字符串,再在子字符串中操作反转。
代码及注释详解:
string reverseStr(string s, int k) {
//需要反转的左右边界
int left,right;
int n=s.size();
for(int i=0;i<n;i+=2*k){
//特殊情况,修改右边界
if((n-i)<k)right=n-1;
else right=i+k-1;
//更新左边界
left=i;
//反转子字符串
while(left<right){
s[left]=s[left]^s[right];
s[right]=s[left]^s[right];
s[left]=s[left]^s[right];
left++;right--;
}
}
return s;
}
Leetcode151(反转字符串里面的单词)
题目描述:
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
思路解析:
三步走:第一删除字符串里多余的空格,第二整体反转字符串,第三反转字符串里面的单词。
代码及注释详解:
void deleteSpace(string &s){
//slow代表需要更新的位置
int slow=0;
//fast代表更新的值
int fast=0;
while(s[fast]){
if(s[fast]!=' '){
//遇到单词,先加空格,如果是第一个单词就不需要。
if(slow!=0)s[slow++]=' ';
//加入单词
while(s[fast]&&s[fast]!=' '){
s[slow++]=s[fast++];
}
}else fast++;
}
//更新长度
s.resize(slow);
}
void reverseWord(string&s){
int i=0;
int left=0;
int right;
while(s[i]){
//遇到单词,反转单词
if(s[i]==' '){
//需要反转单词的范围
reverse(s.begin()+left,s.begin()+i);
//更新下一个单词的起始位置
left=i+1;
}
i++;
}
reverse(s.begin()+left,s.end());
}
string reverseWords(string s) {
//删除多余的空格
deleteSpace(s);
//整体反转字符串
reverse(s.begin(),s.end());
//反转单词
reverseWord(s);
return s;
}
卡码网54(替换数字)
题目描述:
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
代码:
#include<iostream>
#include<string>
using namespace std;
char arr[10005];
int main() {
cin >> arr;
string name="";
for (int i = 0; arr[i]; i++) {
if (arr[i] < 'a' || arr[i] > 'z')name += "number";
else name += arr[i];
}
cout << name << endl;
return 0;
}
卡码网55(右旋字符串)
题目描述:
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
void rightR(string& s,int k) {
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + k);
reverse(s.begin() + k, s.end());
}
int main() {
string s;
int k; cin >> k;
cin >> s;
rightR(s,k);
cout << s << endl;
return 0;
}