代码随想录算法训练营day8

1.反转字符串

1.1 题目链接

. - 力扣(LeetCode)

1.2 题解

class Solution {
public:
    void reverseString(vector<char>& s) 
    {
        int left=0;
        int right=s.size()-1;
        while(left<(s.size()/2))
        {
            swapChar(s[left],s[right]);
            left++;
            right--;
        }
    }
    private:
    void swapChar(char& c1,char& c2)
    {
        char tmp=c1;
        c1=c2;
        c2=tmp;
    }
};

利用双指针思想,一个最开始指向头,一个一开始指向尾,慢慢交换并向中间移动。

2.反转字符串2

2.1 题目链接

. - 力扣(LeetCode)

2.2 题解

class Solution {
public:
string reverseStr(string s, int k) {
    for (int i = 0; i < s.size(); i += 2 * k) {
        if (s.size() - (i + 1) < k) {
            int left = i;
            int right = s.size() - 1;
            while (left < (i + s.size()) / 2) {
                swap(s[left], s[right]);
                left++;
                right--;
            }
        }

        else {

            int left = i;
            int right = i + k - 1;
            while (left < (2 * i + k) / 2) {
                swap(s[left], s[right]);
                left++;
                right--;
            }
        }
    }
    return s;
}
};

和反转字符串1思路差不多,但要考虑尾部不满足2k的情况

3.替换数字

3.1 题目链接

54. 替换数字(第八期模拟笔试)

3.2 题解

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





int main()
{
	string s;
	while (cin >> s)
	{

		//旧的末尾索引
		int oldTailIndex = s.size() - 1;
		//统计字符串中数字的个数
		int count = 0;
		for (auto i : s)
		{
			if (i >= '0' && i <= '9')
			{
				count++;
			}
		}
		//给数组扩容
		s.resize(s.size() + 5 * count);
		//新的末尾索引
		int newTailIndex = s.size() - 1;
		//开始遍历
		while (oldTailIndex >= 0)
		{
			//找到数字了
			if (s[oldTailIndex] >= '0' && s[oldTailIndex] <= '9')
			{
				s[newTailIndex--] = 'r';
				s[newTailIndex--] = 'e';
				s[newTailIndex--] = 'b';
				s[newTailIndex--] = 'm';
				s[newTailIndex--] = 'u';
				s[newTailIndex--] = 'n';
			}
			else
			{
				s[newTailIndex--]=s[oldTailIndex];
			}
			oldTailIndex--;
		}
		cout << s << endl;
	}
	
	
}

思路就是先扩容再加入双指针的思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值