一、反转字符串
1.题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
2.思路:双指针分别从字符串首尾往中间靠拢即可
3.注意:在函数 swapchar(char &a, char &b) 的形参里一定要加 &,没有&时只是交换局部变量 a 和 b。
4.代码:
class Solution {
public:
void swapchar(char &a, char &b)
{
char tmp;
tmp = a;
a = b;
b = tmp;
}
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size()-1;
while(left<right)
{
swapchar(s[left], s[right]);
left++;
right--;
}
}
};
二、反转字符串II
1.题目:给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
2.思路:三指针,分别标记0,k,2k的位置,对k,2k是否超出字符串长度判断。
3.注意:
4.代码:
class Solution {
public:
void swapchar(char &a, char &b)
{
char tmp;
tmp = a;
a = b;
b = tmp;
}
string reverseStr(string s, int k) {
int left = 0;
int right = k-1;
int pre = k * 2 - 1;
int tmpLeft,tmpRight;
while( pre < s.size()-1 )
{
tmpLeft = left;
tmpRight = right;
while(tmpLeft<tmpRight)
{
swapchar(s[tmpLeft], s[tmpRight]);
tmpLeft++;
tmpRight--;
}
left += 2*k;
right += 2*k;
pre += 2*k;
}
if( right>s.size()-1 )
{
tmpLeft = left;
tmpRight = s.size() - 1;
while(tmpLeft<tmpRight)
{
swapchar(s[tmpLeft], s[tmpRight]);
tmpLeft++;
tmpRight--;
}
}else{
tmpLeft = left;
tmpRight = right;
while(tmpLeft<tmpRight)
{
swapchar(s[tmpLeft], s[tmpRight]);
tmpLeft++;
tmpRight--;
}
}
return s;
}
};
三、卡码网54. 替换数字
1.题目:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
2.思路:双指针
3.注意:
(1)替换之前先扩大字符串的size。当从前往后替换时,遇到数字后必定会覆盖原有后续元素,此时为保留原有数据只能使用新的空间,所以在本题中使用从后往前替换覆盖。
(2)熟悉笔试答题方式
4.代码:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
string s;
int numCnt = 0;
while( cin >> s)
{
for(int i=0; i<s.size(); i++)
{
if( s[i] < 'a' || s[i] > 'z')
numCnt++;
}
// 扩充数组长度
int s_oldIndex = s.size() - 1;
s.resize(s.size() + numCnt * 5);
int s_newIndex = s.size() - 1;
// 从后往前填充
while( s_oldIndex >= 0)
{
if( s[s_oldIndex] > '0' && s[s_oldIndex] < '9')
{
s[s_newIndex--] = 'r';
s[s_newIndex--] = 'e';
s[s_newIndex--] = 'b';
s[s_newIndex--] = 'm';
s[s_newIndex--] = 'u';
s[s_newIndex--] = 'n';
}else{
s[s_newIndex--] = s[s_oldIndex];
}
s_oldIndex--;
}
cout << s << endl;
}
}