代码随想录算法训练营第六天| 字符串part01

344. 反转字符串

https://leetcode.cn/problems/reverse-string/
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

class Solution {
public:
    void reverseString(vector<char>& s) {
        int n = s.size();
        for (int i = 0; i < n / 2; ++i) {
            //交换元素
            char temp = s[i];
            s[i] = s[n-1-i];
            s[n-1-i] = temp;
        }
    }
};

541. 反转字符串II

https://leetcode.cn/problems/reverse-string-ii/
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size();
        // 记录闭区间 [left, left + 2 * k - 1] 这 2k 个字符
        for (int right = -1; right < n; right += 2 * k) {

            if(right > 0) {
                // 反转 2k 字符中的前 k 个字符
                int left = right - (2 * k - 1);
                // [left, left + k - 1]
                for (int i = left; i < (left + k / 2); ++i) { 
                    swap(s[i], s[left + k - 1 - i + left]);
                }
            }
            
            // 剩余字符
            int diff = n - right - 1;
            if (diff >= k && diff < 2 * k) { // 反转前 k 个字符 [right + 1, right + k]
                for(int i = right + 1; i < (right + 1 + k / 2); ++i) {
                    swap(s[i], s[right + k - i + right + 1]);
                }
                break;
            }
            else if (diff < k) { // 反转剩余字符 [right + 1, n - 1]
                for(int i = right + 1; i < (right + 1 + (n - right - 1) / 2); ++i) {
                    cout << i << " " << n - i + right << endl;
                    swap(s[i], s[n - i + right]); // n - 1 + right + 1 - i
                }
                break;
            }
        }
        return s;
    }
};
class Solution {
public:
    void reverseString(int start, int end, string& s) {
        for (int i = start, j = end; i < j; ++i, --j) {
            swap(s[i], s[j]);
        }
    }
    string reverseStr(string s, int k) {
        int n = s.size();
        // 记录闭区间 [left, left + 2 * k - 1] 这 2k 个字符
        for (int left = 0; left < n; left += 2 * k) {
            // 反转 2k 字符中的前 k 个字符 或 剩余字符小于 2k 但大于或等于 k 个的前 k 个字符 
            // [left, left + k - 1]
            if (left + k <= n) {
                reverseString(left, left + k - 1, s);
            }
            else { // 剩余字符少于 k 个,则将剩余字符全部反转 [left, n - 1]
                reverseString(left, n - 1, s);
            }
        }
        return s;
    }
};

卡码网:54.替换数字

卡码网题目链接
题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number

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

int main () {
    string s;
    while (cin >> s) {
        int left = s.size() - 1;
        int count = 0; // 统计数字的个数
        for (char c : s) {
            if( c >= '0' && c <= '9') { 
                count++;
            }
        }
        // 扩容原数组为将数字替换为number之后的大小
        s.resize(s.size() + count * 5);
        int right = s.size() - 1;
        while (left >= 0) {
            if (!isdigit(s[left])) {
                s[right--] = s[left];
            }
            else {
                s[right--] = 'r';
                s[right--] = 'e';
                s[right--] = 'b';
                s[right--] = 'm';
                s[right--] = 'u';
                s[right--] = 'n';
            }
            left--;
        }
        cout << s << endl;
    }    
}
#include <iostream>
#include <string>
using namespace std;

int main () {
    string s;
    while (cin >> s) {
    	string res;
        for (char c : s) {
        	if (isdigit(c)) {
        		res += "number";
        	}
        	else {
        		res += c;
        	}
        }
        cout << res << endl;
    }    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值