代码随想录day08(反转字符串,替换数字)

344.反转字符串

哈希表优势:哈希表的查找每一个元素操作的时间复杂度是 O(1),具体来说,当你查找一个元素是否在哈希表中时,哈希表会通过哈希函数将元素映射到一个索引位置,从而可以在常数时间内找到元素。

题目链接/文章讲解/视频讲解:代码随想录

可以尝试思考一下字符题目和数组题目的区别:虽然字符题目和数组题目有时可能会重叠(例如,一个字符串可以被视为字符数组),但是它们的重点和思考方式往往有所不同。

  • 字符题目
    • 常见的解题技巧和数据结构包括 哈希表队列双指针滑动窗口 等。因为字符的个数有限(比如 ASCII 只有 128 个字符,或 Unicode 超过 10 万个字符),通常可以使用哈希表来高效统计和查询。
    • 示例:检查一个字符串是否为有效的括号表达式,常用栈来辅助。
  • 数组题目
    • 常见的解题技巧和数据结构包括 排序算法(如快速排序、归并排序)、哈希表动态规划贪心算法双指针 等。数组题目涉及到更多的数据操作,如排序、合并、查找等。
    • 示例:求解两个数组的交集问题,可以使用哈希表来优化查找操作(可将数组1存入去重的set容器中);而合并两个已排序数组,可以通过双指针技术来实现。
class Solution {
public:
    void reverseString(vector<char>& s) {
        int len=s.size();
        int  right=len-1;
        for(int left=0;left<len/2;left++)
        {
            while(left<right)
            {
                char temp=s[left];
                s[left]=s[right];
                s[right]=temp;
                left++;
                right--;
            }

        }
    }
};
若直接使用字符串的库函数
  • std::swap 是一个常用的交换函数,特别适用于 std::string 和其他复杂类型,可以高效地交换两个对象的内容。
  • 对于 std::stringswap 使用的是传递引用的方式,这意味着不会复制字符串的内容,而是直接交换底层数据,因此非常高效。
  • std::swap 可以与其他算法(如排序)结合使用,简化代码并提高效率。
class Solution {
public:
    void reverseString(vector<char>& s) {
        for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
            swap(s[i],s[j]);
        }
    }
};

541. 反转字符串II

题目链接/文章讲解/视频讲解:代码随想录

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

剩余字符长度用len-i表示,一次处理2K步,所以一次处理的步数中剩余步数一定小于2k,无需再做额外判断

reverse的使用,返回的是迭代器,范围左闭右开

class Solution {
public:
    string reverseStr(string s, int k) {
       int len=s.size();
       for(int i=0;i<len;i+=2*k)
       {
        if(len-i>=k)
        {
            reverse(s.begin()+i,s.begin()+i+k);//reverse为库函数,返回的是迭代器,同时默认区间为左闭右开,即s[i]到s[i+k];
        }
        else 
        {
            reverse(s.begin()+i,s.end());
        }
       }
       return s;
    }
};

卡码网:54.替换数字

相关知识:

  • cin >> c:读取一个字符(忽略空格、换行等空白字符)。cin >> s 每次读取一个以空格分隔的单词,直到遇到输入流的结束符。
  • cin.get(c):读取一个字符(包括空格、换行等所有字符)。
  • cin.getline(str, n):读取一行字符,直到换行符。
  • getline(cin, str):读取一行字符串,包括空格。
  • cin.get():逐个字符读取输入。

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

数组填充问题,预先给数组扩容为填充后的大小,然后从后往前进行操作

好处1.不用申请新数组,降低了空间复杂度,使空间复杂度为O(1)

2.从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

题目链接/文章讲解:替换数字

#include<iostream>
using namespace std;
int main() {
    string s;
    while (cin >> s)
    {
        int count = 0;
        int OldIndex = s.size() - 1;
        for (int i = 0; i < s.size(); i++)
        {
            if (s[i] >= '0' && s[i] <= '9')
            {
                count++;
            }
        }

        s.resize(s.size() + 5 * count);
        int NewIndex = s.size() - 1;
        while (OldIndex >= 0)
        {
            if (s[OldIndex] >= '0' && s[OldIndex] <= '9')
            {
                s[NewIndex--] = 'r';
                s[NewIndex--] = 'e';
                s[NewIndex--] = 'b';
                s[NewIndex--] = 'm';
                s[NewIndex--] = 'u';
                s[NewIndex--] = 'n';
            }
            else
            {
                s[NewIndex--] = s[OldIndex];
            }
            OldIndex--;
        }
        cout << s << endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值