字符串操作
字符串类型string
在c++中具有丰富的库函数,在刷题过程中为了加深理解,应尽量少地使用库函数。
反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0, j = s.size() - 1; i < j; i++, j--)
{
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
};
反转字符串2
思路很简单,把字符串s
分段处理。
class Solution {
public:
string reverseStr(string s, int k) {
int size = s.size();
int lastS = size % (2*k);//最后不足2k长度的字符串单独处理;
int num2K = size / (2*k);//2k字符串的数量;
for(int i = 0; i < num2K; i++)
{
//翻转i*2*k ~ i*2*k+k-1间的字符
int left = 2*i*k;
int right = 2*i*k+k-1;
while(left < right){
swap(s[left], s[right]);
left++;
right--;
}
}
if(lastS >= k)
{
//翻转num2K*2*k ~ num2K*2*k+k-1间的字符
int left = num2K*2*k;
int right = num2K*2*k+k-1;
while(left < right){
swap(s[left], s[right]);
left++;
right--;
}
}
else{
//翻转num2K*2*k ~ size-1间的字符
int left = num2K*2*k;
int right = size-1;
while(left < right){
swap(s[left], s[right]);
left++;
right--;
}
}
return s;
}
};
使用库函数的简易代码:
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.size(); i += 2 * k){
if(i + k < = s.size()){
reverse(s.begin() + i, s.begin() + i + k);
}
else{
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
替换数字
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
while(cin >> s){
int oldSize = s.size();
int count = 0;
for(char ch : s)
{
if(ch >= '0' && ch <= '9')
{
count++;
}
}
s.resize(oldSize + 5 * count);
int newSize = s.size();
int j = newSize - 1;
for(int i = oldSize - 1; i >=0; i--){
if(s[i] >= '0' && s[i] <= '9'){
s[j--] = 'r';
s[j--] = 'e';
s[j--] = 'b';
s[j--] = 'm';
s[j--] = 'u';
s[j--] = 'n';
}
else{
s[j--] = s[i];
}
}
for(int i = 0; i < newSize; i++)
{
cout << s[i];
}
cout<<endl;
}
system("pause");
return 0 ;
}
反转字符串中的单词
class Solution {
public:
string reverseWords(string s) {
//移除多余空格
int n = s.size();
int slow = 0; int fast = 0;
for(; fast < n; fast++)
{
if(s[fast] == ' ') continue;
while(fast < n && s[fast] != ' ')
{
s[slow++] = s[fast++];
}
s[slow++] = ' ';
}
s.resize(slow-1);
n = s.size();
if(n < 2) return s;
//反转字符串
slow = 0; fast = n-1;
while(slow < fast)
{
swap(s[slow++], s[fast--]);
}
//将单词再反转
for(fast = 0; fast < n; fast++)
{
slow = fast;
while(fast < n && s[fast] != ' ')//fast在slow后的第一个空格或者n处停下
{
fast++;
}
int left = slow;
int right = min(n-1, fast-1);
while(left < right)
{
swap(s[left++], s[right--]);
}
}
return s;
}
};
右旋字符串
我的方法:创建新的字符串变量。
#include<iostream>
#include<string>
using namespace std;
int main(){
int k;
string s;
string newS;
cin>>k;
cin>>s;
int size = s.size();
for(int i = 0; i < k; i++){
newS.push_back(s[size - k + i]);
}
for(int i = 0; i < size - k; i++){
newS.push_back(s[i]);
}
cout<<newS<<endl;
return 0 ;
}
代码随想录中不使用额外空间的方法:反转再反转。
#include<iostream>
#include<string>
using namespace std;
string reverse(string s, int left, int right){
while(left < right){
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
return s;
}
int main(){
int k;
string s;
cin>>k;
cin>>s;
int size = s.size();
s = reverse(s, 0, size - 1);
s = reverse(s, 0, k - 1);
s = reverse(s, k, size - 1);
cout<<s<<endl;
return 0 ;
}
项目
今天没实质性进展。