代码随想录算法训练营刷题Day08|344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串

目录

string基本用法

1.1 string类常见构造

1.2 string类常用功能

1.3 读写string操作

1.4 cctype头文件(判断字符类型:大/小写字母、标点、数字等)

1.5 for循环遍历

344.反转字符串

541. 反转字符串II

剑指Offer 05.替换空格

151.翻转字符串里的单词

剑指Offer58-II.左旋转字符串

string基本用法

1.1 string类常见构造

1、string s1;

2、string s2 = s1;

3、string s3(s2);

4、string s4 = "hello world";

5、string s5("hello world");

6、string s6(6 , 'a');

7、string s7(s6,3);    //从s6的下标3开始的字符拷贝

8、string s8(s6, pos, len);     //s8是从s6的下标pos开始的len个字符的拷贝

1.2 string类常用功能

1、reverse用法(加头文件<algorithm>):reverse(s.begin(),s.end());

reverse(s, i, i+k);     //对字符串s从第i个到第i+k个进行反转

reverse函数反转string

2、insert用法:s.insert(pos,args)

在pos前插入args指定的字符

3、erase用法:s.erase(pos,len)

删除从pos开始的len个字符。如果len省略则删除pos开始的后面所有字符。返回一个指向s的引用

4、assign用法:s.assign(args)

将s中的字符替换为args指定的字符。返回一个s的引用

s.assign(args, n)

将s替换为args的前n个字符,返回一个s的引用

5、append用法:s.append(args)

将args追加到s。返回一个指向s的引用。args必须是双引号字符串

6、replace用法:将s中范围为range内的字符替换为args指定的字符

7、find用法:查找s中args第一次出现的位置

8、rfind用法:查找s中args最后一次出现的位置

9、to_string用法:to_string(val)

将数值val转换为string返回。val可以是任何数据类型(int、浮点数等)

10、stoi(s) / atoi(c) :字符串/字符 转换为整数并返回

11、stof(s) / atof(c) :字符串/字符 转换为浮点数并返回

12、s.substr(pos,n):从索引pos开始,提取连续的n个字符,包括pos位置的字符

13、s.push_back(  char& c ):字符串s后面加入字符c

1.3 读写string操作

1、输入遇到空格或者回车当前字符串输入停止,转到下一个字符串

string s1,s2,s3;
cin >> s1; //单字符串输入,遇到空格或回车代表当前单字符串赋值完成
cin >> s2 >> s3; //多字符串的输入,遇到空格代表当前字符串赋值完成,转到下一个字符串赋值

2、如果希望在最终读入的字符串中保留空格,可以使用getline函数

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1;
    getline(cin , s1);
    cout << s1 << endl;
}

3、查询字符串信息、索引

可以用empty/size/length查询字符串状态及长度,可以用下标操作提取字符串中的字符

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1;
    string s2("hellow world");
    cout << s1.empty() << endl;
    cout << s2.size() <<endl; //返回s2中字符个数,不包括空字符
    cout << s2.length() <<endl; //同上
    cout << s2[0] << endl; //字符串本质是字符串数组
    cout << s2[100] << endl;  //空字符也是可以返回
}

4、拼接、比较等操作

s3 = s1+s2; //返回s1和s2拼接后的结果。加号两边至少一个string对象
s1 == s2; //s1和s2中的元素完全相等则相等,区分大小写
s1 != s2;
<, <=, >, >= //利用字符的字典序进行比较,区分大小写

1.4 cctype头文件(判断字符类型:大/小写字母、标点、数字等)

cctype 头文件中含有string 中字符操作的库函数,如下:

isalnum(c)    //当是字母或数字时为真
isalpha(c)    //当是字母时为真
isdigit(c)    //当是数字时为真
islower(c)    //当是小写字母时为真
isupper(c)    //当是大写字母时为真
isspace(c)    //当是空白(空格、回车、换行、制表符等)为真
isxdigit(c)   //当是16进制数字为真
ispunct(c)    //当是标点符号时为真
isprint(c)    //当是可打印字符时为真
isgraph(c)    //当不是空格但可打印为真
iscntrl(c)    //当是控制字符时为真
tolower(c)    //若c是大写字母,转换为小写输出,否则原样输出
toupper(c)    //若c是小写字母,转换为大写输出,否则原样输出

1.5 for循环遍历

例子:将一串语句中的小写变成大写

#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
    string s1 = "Nice to meet you!";
    for(auto &c : s1)
    {
        if(c.islower()) c = toupper(c);
    }
    cout << s1 << endl;
    return 0;
}

344.反转字符串

力扣:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

1、解法:双指针法

2、注意:字符串的本质就是字符串数组,这道题就是字符串数组,如果是字符串也可以用数组中可以用的一些方法来做。

3、代码:

class Solution {
public:
    void reverseString(vector<char>& s) {
    int left = 0, right = s.size()-1;
    while(left < right)
    {
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
        left++;
        right--;
    }
    }
};

541. 反转字符串II

力扣:给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

1、关键:for循环里 i 每次增加 2k

2、reverse函数的使用:reverse(s.begin(),s.end());

3、代码:

class Solution {
public:
    string reverseStr(string s, int k) {
    //使用reverse函数
    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;
    }
};

剑指Offer 05.替换空格

力扣:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

1、解法一:定义一个新的字符串。遍历旧的字符串,如果是空格则新字符串push_back字符

2、代码:

class Solution {
public:
    string replaceSpace(string s) {
    string res;
    for(char c: s)
    {
        if(c==' ')
        {
            res.push_back('%');
            res.push_back('2');
            res.push_back('0');
        }
        else res.push_back(c);
    }
    return res;
    }
};

151.翻转字符串里的单词

力扣:给定一个字符串,逐个翻转字符串中的每个单词

1、步骤:

step1、删除字符串中冗余空格

step2、翻转字符串

step3、翻转字符串中单个单词

2、补充:

resize:改变 vector / string 的长度和内存大小

reserve:改变 vector / string 的内存大小

3、代码:

class Solution {
public:
    //step1、删除字符串中冗余空格
    void deleteBlank(string& s)
    {
        //双指针法
        int slow = 0;
        for(int fast = 0;fast<s.size();fast++)
        {
            if(s[fast] != ' ')
            {
                if(slow != 0)
                {
                    s[slow] = ' ';
                    slow++;
                }
                while(s[fast]!=' ' && fast<s.size())
                {
                    s[slow] = s[fast];
                    slow++;
                    fast++;
                }
            }
        }
        s.resize(slow);
    }
    string reverseWords(string s) {
    //删除冗余空格
    deleteBlank(s);
    //反转s
    reverse(s.begin(),s.end());
    //当碰到空格或者指针在字符串最末端反转单词
    int start = 0;
    for(int i = 0; i<=s.size(); i++)
    {
        if(s[i]==' ' || i == s.size())
        {
            reverse(s.begin()+start , s.begin()+i);
            start = i+1;
        }
    }
    return s; 
    }
};

剑指Offer58-II.左旋转字符串

力扣:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

1、步骤:

step1、翻转前n个子字符串

step2、翻转n到末端的子字符串

step3、翻转字符串

2、代码:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
    //翻转前n个子字符串
    reverse(s.begin(),s.begin()+n);
    //翻转从序号n到末端子字符串
    reverse(s.begin()+n,s.end());
    //翻转字符串
    reverse(s.begin(),s.end());
    return s;
    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值