反转字符串(344)
本题采用双指针的思想,开头放一个指针,结尾放一个指针,定义一个变量a,用于交换,然后两个指针向中间逼近。条件i<j,i=j没有意义,不用交换。
class Solution {
public:
void reverseString(vector<char>& s) {
char a='0';
for(int i=0,j=s.size()-1;i<j;i++,j--)
{
a=s[i];
s[i]=s[j];
s[j]=a;
}
}
};
反转字符串(541)
利用reverse库函数,库函数一般默认区间是左闭右开,因此,(s.begin()+i,s.begin()+i+k)即[s.begin()+i,s.begin()+i+k)
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i=i+(2*k))
{
if(i+k<=s.size())
{
reverse(s.begin()+i,s.begin()+i+k);
}
else
{
reverse(s.begin()+i,s.end());
}
}
return s;
}
};
不利用库函数,自己写的函数可以是左闭右开,也可以是左闭右闭,这里用的是左闭右闭
class Solution {
public:
void reverser(string&s,int start,int end)
{
int tmp=0;
for(int i=start,j=end;i<j;i++,j--)
{
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i=i+(2*k))
{
if(i+k<=s.size())
{
reverser(s,i,i+k-1);
}
else
{
reverser(s,i,s.size()-1);
}
}
return s;
}
};
替换空格(05)剑指0ffer
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
首先将数组进行扩充(因为原始字符串中的空格替换成%20,长度就有可能不够了),因此将字符串扩充到加入%20的长度。其次,采用双指针的思路,指针i指向原始字符串的末尾,指针j指向新字符串的末尾。然后从后向前移动指针(如果从前向后移动指针,每移动一个元素,后面的元素要接着向后移动,因此采取从后向前)
补充:空字符'/0',长度为0,字符串结束的标志
空格符' ',长度为1
resize()是分配容器的内存大小,而reserve()只是设置容器容量大小,但并没有真正分配内存。
resize()可以传递两个参数,分别是大小和初始值,初始值默认为0,reserve()只能传递一个参数,不能设置初始值,其初始值为系统随机生成。
class Solution {
public:
string replaceSpace(string s) {
int count=0;
int oldsize=s.size();
for(int i=0;i<s.size();i++)
{
if(s[i]==' ')
{
count++;
}
}
s.resize(s.size()+count*2);
int newsize=s.size();
for(int i=oldsize-1,j=newsize-1;i<j;i--,j--)
{
if(s[i]!=' ')
{
s[j]=s[i];
}
else
{
s[j]='0';
s[j-1]='2';
s[j-2]='%';
j-=2;
}
}
return s;
}
};
左旋转字符串(05)剑指0ffer
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符 串 左旋转操作的功能。比如 ,输 入字符串 "abcdefg" 和数字2 , 该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
先翻转前k个,再翻转除前k个,最后整体翻转
class Solution {
public:
string reverseLeftWords(string s, int n) {
int tmp=0;
for(int i=0,j=n-1;i<j;i++,j--)
{
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
for(int i=n,j=s.size()-1;i<j;i++,j--)
{
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
for(int i=0,j=s.size()-1;i<j;i++,j--)
{
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
return s;
}
};
翻转字符串里的单词(151)
补充:
用法不同:++i是先改变i的值即加1后再使用i的值;而i++是先使用i的值在改变它的值即加。
swap函数作用:
tmp=s[j];
s[j]=s[i];
s[i]=tmp;
class Solution {
public:
//字符串翻转
void reverse(string&s,int satrt,int end)
{
for(int i=satrt,j=end;i<j;i++,j--)
{
swap(s[i],s[j]);
}
}
//字符串去除空格
void removeExtraSpaces(string&s)
{
int slow=0;
for(int i=0;i<s.size();i++)
{
if(s[i]!=' ')//只考虑不为0的空格,应为为0的空格将会下面的赋值表达式覆盖
{
if(slow!=0)//每一个单词结束后,在后面加空格
{
s[slow++]=' ';
}
while(i<s.size()&&s[i]!=' ')//这里相当于循环了一个单词的长度,s[i]为空格退出,
然后在执行i++,从头开始,slow指向不会为空格,然后通过上面的slow!=0,给它加空格
{
s[slow++]=s[i++];
}
}
}
s.resize(slow);//*******************************
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s,0,s.size()-1);
//字符串每个单词进行翻转
int start=0;
for(int i=0;i<=s.size();i++)
{
if(i==s.size()||s[i]==' ')//到达空格或者串尾,说明一个单词结束
{
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};
上面说slow指向不会为空格,应为一个单词结束,slow不为空格的时候,才能进行给slow进行赋值空格,但是如果是“00000sky00th0sgu”这种字符串的时候,slow就会指向空格,单词后面不就添加不了空格了?