Day 8 字符串篇补进度

输入输出的读取

可以使用标准库中的 <iostream> 来处理输入输出  

 <string> 和 <algorithm> 来处理字符串  

using namespace std; //使用std命名空间,这样我们就可以直接使用如cin、cout、string等标准库中的对象,而不需要每次都加上std::前缀。

  • cin >> k; 用于读取正整数 k
  • cin.ignore(); 用于忽略输入流中的换行符,这是因为当我们使用 cin 读取整数时,它会留下换行符在输入缓冲区中,这可能会干扰后面的 getline 调用。
  • getline(cin, s); 用于读取整行字符串 s
  • cout << s << endl; 用于输出旋转后的字符串。

C++的字符串

在C++中,虽然没有像Python中那样的切片操作,但是可以通过不同的方法来实现字符串的引用和拼接操作。以下是一些常见的操作方式

1、使用substr函数来截取子字符串substr函数可以用来获取原字符串的子串,从而实现类似Python中切片的效果

string s = "Hello, World!";
// 获取前n个字符
string sub1 = s.substr(0, n);
// 获取从索引n开始到结束的字符
string sub2 = s.substr(n);

2、使用+/+=操作符来拼接字符串:可以使用+操作符将多个字符串拼接在一起。

string str1 = "Hello";
string str2 = "World";
string result = str1 + ", " + str2 + "!";

string str = "Hello";
str += ", World!";

3、使用append函数来拼接字符串:可以使用append函数来将一个字符串添加到另一个字符串的末尾。

string str1 = "Hello";
string str2 = "World";
str1.append(", ").append(str2).append("!");

python和字符串

很多语言对字符串提供了 split(拆分),reverse(翻转)和 join(连接)等方法,因此我们可以简单的调用内置的 API 完成操作:

使用 split 将字符串按空格分割成字符串数组;
使用 reverse 将字符串数组进行反转;
使用 join 方法将字符串数组拼成一个字符串。

  1. s.split(): 这里使用s.split()方法将字符串s按空格进行分割,得到一个单词的列表。
  2. reversed()reversed()函数是Python内置函数,用于生成一个反向迭代器,倒序遍历集合中的元素。在这里,我们将分割后的单词列表进行倒序排列。
  3. " ".join(): 使用" ".join()方法将倒序后的单词列表以空格为分隔符连接成一个新的字符串。

替换数字

很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。

#include <iostream> //引入C++标准库中的输入输出流头文件,用于支持输入输出操作。
using namespace std; //使用std命名空间,这样我们就可以直接使用如cin、cout、string等标准库中的对象,而不需要每次都加上std::前缀。
int main(){
    string s;//定义一个string类型的变量s,用于存储从输入中读取的字符串
    //while循环,用于从标准输入cin中读取字符串,直到没有更多输入或遇到文件结束符
    while (cin>>s){
        int sOldIndex=s.size()-1;
        int count=0;
        for (int i=0;i<s.size();i++){
            if (s[i]>='0' && s[i]<='9'){
                count++;
            }
        }
        //扩充字符串的大小
        s.resize(s.size()+count*5);
        int sNewIndex=s.size()-1;
        //从后向前替换
        while(sOldIndex>=0){
            if (s[sOldIndex]>='0' && s[sOldIndex]<='9'){
                s[sNewIndex--]='r';
                s[sNewIndex--]='e';
                s[sNewIndex--]='b';
                s[sNewIndex--]='m';
                s[sNewIndex--]='u';
                s[sNewIndex--]='n';
            }else{
                s[sNewIndex]=s[sOldIndex];
                sNewIndex--;
            }
            sOldIndex--;
        }
        cout<<s<<endl;
    }
}

151.翻转字符串里的单词

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

在C++中,swap 函数通常用于交换两个元素的值。

class Solution {
public:
    void reverse(string&s,int start,int end){
        for(int i=start,j=end;i<j;i++,j--){
            swap(s[i],s[j]);
        }
    }
    void removeExtraSpace(string&s){
        //去除所有空格并在相邻的单词之间添加空格,运用快慢指针的方法
        int slow=0;
        for(int fast=0;fast<s.size();fast++){
            if(s[fast]!=' '){
                //当快指针遇到字母的时候添加进去
                if (slow!=0){
                    s[slow++]=' ';
                }
                while (fast<s.size() && s[fast]!=' '){ 
                    //找到单词的头部并在前面加了空格后,添加整个单词
                    s[slow++]=s[fast++];
                }        
            }
        }
        s.resize(slow);
    }
    string reverseWords(string s){
        //先去除空格
        //找到单词的头尾并颠倒
        
        removeExtraSpace(s);
        // 整体反转字符串
        reverse(s, 0, s.size() - 1);
        // 先整个颠倒? 然后每个单词内部颠倒?
        //话说为什么不一个个找?
        int start=0;
        for (int i=0;i<=s.size();i++){
            if(s[i]==' ' || i==s.size()){
                reverse(s,start,i-1);   
                start=i+1;         
            }
        }
        return s;
    }   
};

55. 右旋字符串

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

# include<iostream>
# include<string>
# include<algorithm>
using namespace std;
int main(){
    int n;
    string s;
    
    cin>>n;
    cin.ignore();
    getline(cin,s); //用于忽略输入流中的换行符
    
    // reverse(s.begin(),s.end());
    // reverse(s.begin(),s.begin()+n);
    // reverse(s.begin()+n,s.end());
    
    // cout << s << endl;
    string result = s.substr(s.length() - n) + s.substr(0, s.length() - n);
    cout<<result<<endl;    
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值