代码随想录刷题02.16
字符串相关操作1
LeetCode题目
解题思路
1.利用双指针法调换头尾顺序;
2.注意模板的使用方法:template后面不用跟上";"
代码过程
class Solution {
public:
template<class T>
void myswap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}
void reverseString(vector<char>& s) {
int size=s.size();
int left=0,right=size-1;
while(left<right)
{
myswap(s[left],s[right]);
left++;
right--;
}
}
};
LeetCode题目
解题思路
1)在写循环代码时,要找到最普遍的情况,可假设遍历了第一次之后的情况,看循环体代码应该如何表达。
2)在使用引用&时,要想明白传递的是谁的地址。
代码过程
class Solution {
public:
void reverse(string& s,int left,int right)
{
while(left<right)
{
char temp;
temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k)
{
if(i+k>s.size()){
reverse(s,i,s.size()-1);
break;
}
else
{
reverse(s,i,i+k-1);
}
}
return s;
}
};
LeetCode题目
解题思路
解题思路:
1)首先统计原字符串中的空格数量;更新新字符串的数组大小;
2)接着利用双指针法更新新数组。
双指针法的妙用:
1)当双指针都从一端开始移动时,可用于更新数组;
注意:数组更新要考虑从首到尾还是尾到首,这是由于数组添加或删除元素的不便性决定的。
2)当双指针从两头开始移动时,可用于反转数组。
代码过程
class Solution {
public:
string replaceSpace(string s) {
int oldsize=s.size();
int count=0;
for(int i=0;i<s.size();i++)
{
if(s[i]==' ')count++;
}
int newsize=oldsize+2*count;
s.resize(newsize);
int fast=oldsize-1;
int slow=newsize-1;
while(slow>fast)
{
if(s[fast]!=' '){
s[slow]=s[fast];
slow--;
fast--;
}
else{
s[slow]='0';
s[slow-1]='2';
s[slow-2]='%';
slow-=3;
fast--;
}
}
return s;
}
};
LeetCode题目
解题思路
1)解题思路:
i)首先删除字符串中的多余空格:
整体思路:双指针法。快指针遍历原字符串数组,慢指针对字符串数组进行更新;
遍历整个字符串,当遍历的字符不是’ ‘时,则往下进行单词遍历。单词遍历前,利用慢指针首先添加’ '。
ii)接着,整体字符串反转;
iii)最后,反遇到空格或字符串末尾时反转每个单词。
2)单词遍历是一个循环,整个字符串遍历也是一个循环;两者的循环结束条件不一样。
代码过程
class Solution {
public:
void removekongge(string& s){
int fast=0,slow=0;
for(fast=0;fast<s.size();fast++)
{
if(s[fast]!=' '){
if(slow!=0)s[slow++]=' ';
while(s[fast]!=' '&&fast<s.size())
{
s[slow]=s[fast];
slow++;
fast++;
}
}
}
s.resize(slow);
}
void reserve(string& s,int left,int right){
while(left<right)
{
char temp;
temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}
string reverseWords(string s) {
removekongge(s);
reserve(s,0,s.size()-1);
int start=0;
for(int i=0;i<=s.size();i++)
{
if(i==s.size()||s[i]==' '){
reserve(s,start,i-1);
start=i+1;
}
}
return s;
}
};
LeetCode题目
解题思路
解题思路:局部反转与整体反转的结合
1)首先,将前n个数组字符进行反转;
2)接着,将后面的数组字符进行反转;
3)最后,将整体字符数组进行反转。
总结:针对整体反转结合局部反转这种问题,要弄清楚局部反转的边界条件(局部反转循环体的结束位置)很关键。
代码过程
class Solution {
public:
void reverse(string& s,int left,int right){
while(left<right)
{
char temp;
temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}
string reverseLeftWords(string s, int n) {
reverse(s,0,n-1);
reverse(s,n,s.size()-1);
reverse(s,0,s.size()-1);
return s;
}
};