代码随想录算法训练营第八天 | 541. 反转字符串II、54. 替换数字(第八期模拟笔试)、 151.翻转字符串里的单词(cpp)

反转字符串

题目链接

题目解答

class Solution {
public:
    string reverseStr(string s, int k) {
        int len = s.length();
        bool flag = true;
        int count = 0;
        for (int i = 0; i < len; i += 2 * k) {
            if (i + k <= len) reverse(s.begin() + i, s.begin() + i + k);
            else reverse(s.begin() + i, s.end());
        }
        return s;
    }
};

解题心得

1、卡哥的解法很有牛,让我长知识了。

2、在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。

替换数字

题目链接

题目解答

  • #include<iostream>
    #include<string>
    
    using namespace std;
    
    
    
    int main() {
    	string str;
    	cin >> str;
    	int count = 0;
    	int len1 = str.length();
    	for (int i = 0; i < str.length(); i++)
    		if (str[i] >= '0' && str[i] <= '9')
    			count++;
    	str.resize(str.length() + count * 5);
    	int len2 = str.length();
    	int i = len1 - 1, j = len2 - 1;
    	while (i >= 0) {
    		if (str[i] >= '0' && str[i] <= '9') {
    			//替换为number
    			str[j] = 'r';
    			str[j - 1] = 'e';
    			str[j - 2] = 'b';
    			str[j - 3] = 'm';
    			str[j - 4] = 'u';
    			str[j - 5] = 'n';
    			j -= 6;
    			i--;
    		}
    		else {
    			str[j--] = str[i--];
    		}
    	}
    	cout << str << endl;
    
    	return 0;
    }

附:该题目先使用resize扩容,再使用双指针从后往前进行对字符串数组的填充。(看的卡哥的解答)

  •      #include<iostream>
         #include<string>
         using namespace std;
         int main(){
             int i=0;
             string s;
             cin>>s;
             while(i<s.length()){
                 if((int) s[i]-'1'>=0 && (int) s[i]-'1'<=9){
                       s.replace(i,1,"number");
                       i+=5;
                 }
                 i++;
             }
             cout<<s<<endl;
             return 0;
         }

附:这是自己写的(调用库函数),还是没啥意思。

翻转字符串里的单词

题目链接

题目解答(添加了一些代码,以便能够在编译器上运行)

#include<iostream>
#include<string>
using namespace std;

class Solution {
public:
    string reverseWords(string s) {
        int slow = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] != ' ') {
                if (slow != 0) s[slow++] = ' ';
                while (i < s.length() && s[i] != ' ') s[slow++] = s[i++];
            }
        }
        s.resize(slow);
        reverse(s.begin(), s.end());
        int i = 0;
        while (i < slow) {
            int temp = i;
            while (i < slow && s[i] != ' ') i++;
            reverse(s.begin() + temp, s.begin() + i );
            i++;
        }
        return s;
    }
};

int main() {
    string s;
    getline(cin, s);
    Solution s1;
    s = s1.reverseWords(s);
    cout << s << endl;
	return 0;
}

解题心得

1、解答该题目要消除空格和翻转字符串。

2、消除空格,就像当时的消除数组中的元组一样,定义两个指针进行操作,对于该题一定要记住一点,我们只对非空格操作,对于每一个单词都要在前面加一个空格(第一个单词除外)。那么如何对第一个单词进行操作,那么就是当 slow 为 0 时也就是第一个单词的时候。

3、翻转字符串,先翻转整体的字符串,然后在逐个翻转单个单词。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值