继续补打卡中…,冲冲冲!!!
字符串part01
344 反转字符串
题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路
过于简单,就首尾依次遍历互换。
代码
void reverseString(vector<char>& s) {
for(int i=0, j=s.size()-1; i<j; i++, j--){
char tempCh=s[i];
s[i]=s[j];
s[j]=tempCh;
}
}
541 反转字符串II
题目
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
思路
就像题目要求的那样。
代码
void myrever(string &s, int start, int end){
for(int i=start, j=end; i<j; i++, j--){
swap(s[i], s[j]);
}
}
string reverseStr(string s, int k) {
int pre=0;
for(int i=2*k-1; i<s.length(); i+=2*k){
myrever(s, pre, i-k);
pre=i+1;
}
int remain=s.length()%(2*k);
if(remain!=0){
myrever(s, pre, remain<k?pre+remain-1:pre+k-1);
}
return s;
}
卡码网:54.替换数字
题目
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
思路
考虑不使用额外的辅助空间
先将字符串扩容至数字字符替换为number后的大小,然后从后向前遍历字符串,遍历到字母的话直接放在字符串后面,遍历到数字的话就替换为number放到字符串后面。
代码
#include <string>
#include <iostream>
using namespace std;
int main(){
string s;
cin>>s;
int len=s.length();
int temp=len;
for(int i=0; i<s.length(); i++){
if((s[i]-'0')>=0&&(s[i]-'0')<=9){
len+=5;
}
}
s.resize(len);
int index=s.length()-1;
for(int i=temp-1; i>=0; i--){
if((s[i]-'0')>=0&&(s[i]-'0')<=9){
s[index--]='r';
s[index--]='e';
s[index--]='b';
s[index--]='m';
s[index--]='u';
s[index--]='n';
}else{
s[index--]=s[i];
}
}
cout<<s<<endl;
}
151 翻转字符串里的单词
题目
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
思路
先将字符串s中的空格处理一下,去掉首尾空格,将单词之间的多个空格改为一个;
之后整体翻转字符串s,然后遍历字符串s,每遍历到一个单词,就将该单词翻转过来,这样就实现了翻转字符串中单词的顺序。
代码
void reverseStr(string& s, int start, int end){
while(start<end){
swap(s[start], s[end]);
start++;
end--;
}
}
string reverseWords(string s) {
int start=0;
while(s[start]==' '){
start++;
}
int end=s.length()-1;
while(s[end]==' '){
end--;
}
string str=s.substr(start, end-start+1);
int index=0;
for(int i=0; i<str.length(); i++){
if(str[i]==' '){
while(str[i+1]==' '){
i++;
}
}
str[index++]=str[i];
}
string result=str.substr(0, index);
reverseStr(result, 0, result.length()-1);
int pre=0;
for(int i=0; i<result.length(); i++){
if(result[i]==' '){
reverseStr(result, pre, i-1);
pre=i+1;
}
if(i==result.length()-1){
reverseStr(result, pre, i);
}
}
return result;
}
卡码网:55.右旋转字符串
题目
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
思路
先整体反转,再局部反转,就实现了右旋。
代码
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int k;
string s;
cin>>k>>s;
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin()+k);
reverse(s.begin()+k, s.end());
cout<<s<<endl;
}