前言
今日文案:
如果说艰难险阻是人生的黑夜,那么自信就是照亮黑夜的火把。自信的目光是自豪的,自信的微笑是成熟的,自信的力量是巨大的,自信的神态是从容的。
一、反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
题目来源:
解题思路:
就是一个简单双指针,很反转数组一样。
class Solution { public: void reverseString(vector<char>& s) { int n=s.size(); int left=0,right=n-1; while(left<right) {int temp=s[left]; s[left]=s[right]; s[right]=temp; right--; left++; } } };
二、反转字符串||
题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
题目来源:
解题思路:
关键是判断字符串剩余的长度,还有指针所指的位置。
class Solution { public: string reverseStr(string s, int k) { int n=s.size(); int left,right; for(int i=0;i<n;i+=(k*2)) //每次i自增2k { if(i+k<n) //也就是right还在字符串范围内 { left=i; //left,每次加2k right=i+k-1; //right与left的距离其实是固定的,可以用笔算 } else { left=i; //如果right已经超了,那就直接指向末端 right=n-1; } while(left<right) //交换 { int temp=s[left]; s[left]=s[right]; s[right]=temp; right--; left++; } } return s; } };
三、替换空格
题目描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
题目来源:
解题思路:
我一开始最早想到的是遍历到空格就直接插入%20,不是简简单单?但是,%20是三个字符,但空格却只是一个,这就不够空间了,所有扩大空间是必要的,那么一个变三个,我们就是扩大空间就行。
那我们要怎么做,重新申请一个大数组,再遍历输入???可以,但没必要,我们看一下这种双指针解法。
class Solution { public: string replaceSpace(string s) { int n1=s.size(),count=0; for(int i=0;i<n1;i++) //遍历 { if(s[i]==32) //要是是空格就记录 { count++; } } s.resize(n1+count*2); //加大空间 int n2=s.size(); for(int i=n1-1,j=n2-1;i<j;i--,j--) //从后开始遍历 { if(s[i]!=32) //前面没有遇到空格之前,就搬运 { s[j]=s[i]; } else //遇到空格了,后面先存放%20然后后面继续遍历 { s[j]='0'; s[j-1]='2'; s[j-2]='%'; j=j-2; } } return s; } };
四、反转字符串中的单词
题目来源:
解题思路:
这道题,我一开始看真的懵了,写不出来要怎么反转字符串里的单词,我只会整个反转,直接看代码吧。
class Solution { public: void Delet(string &s,int start,int end) { int slow=0,j=0; for(int i=start;i<=end;i++){ if(s[i]!=' ') //等于字母的时候开始操作了 { if(slow!=0) //如果slow不在开头了,可以直接手动加一个空格,作为单词间隔 { s[slow]=' '; slow++; } while(i<s.size()&&s[i]!=' ') //搬运 { s[slow]=s[i]; slow++; i++; } } } s.resize(slow); } void myswap(string &s,int left,int right) { while(left<right) //交换字符 { int temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; } } string reverseWords(string s) { int start=0,end=s.size()-1,i=0,j=0,count=0; Delet(s,start,end); myswap(s,start,s.size()-1); while(i<=s.size()) //注意判断好i,和j的值 { if(s[i]==' ') { myswap(s,j,i-1); j=i+1; } i++; } myswap(s,j,s.size()-1); //后面要多做一组,因为最后一组已经退出了 return s; } };
五、左旋转字符串
题目来源:
解题思路:
三步走,左部分反转,右部分反转,全部反转。
class Solution { public: string reverseLeftWords(string s, int n) { reverse(s.begin()+n,s.end()); reverse(s.begin(),s.begin()+n); reverse(s.begin(),s.end()); return s; } };
总结
加油!