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::string
,swap
使用的是传递引用的方式,这意味着不会复制字符串的内容,而是直接交换底层数据,因此非常高效。 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;
}
}