(6)Z字形变换
实现思路:(如图所示)
具体实现代码如下:
class Solution {
public:
string convert(string s, int n) {
string res;
if(n==1)
{
return s;
}
for(int i=0;i<n;i++)
{
if(i==0 || i==n-1)
{
for(int j=i;j<s.size();j+=2*n-2)
{
res+=s[j];
}
}//这种情况对应的是第一行与最后一行,此时仅仅为一个等差数组,公差为2*n-2
else
{
for(int j=i,k=2*n-2-i;j<s.size() || k<s.size();j+=2*n-2,k+=2*n-2)
{
if(j<s.size()) res+=s[j];
if(k<s.size()) res+=s[k];
}
}
}
return res;
}
};
(7)整数反转(简单)
实现思路:
首先我们看一下一般的思路,我们利用一个while循环,内部条件就是对应的数不是0,不停地输出对应的数字x%10,然后x/10更新即可,下一步就是对应打印出来的数字变作整数,公式就是r=r*10+(x%10),r从0开始,依次加一即可实现(这有一个注意的点:在C++中,正数模10得到的是正数,负数模10得到的是负数,所有我们这里不需要考虑负数的情况!)
具体代码实现如下:
class Solution {
public:
int reverse(int x) {
long long res=0;
while(x)
{
res=res*10+(x%10);
x/=10;
}
if(res>INT_MAX) return 0;
if(res<INT_MIN) return 0;
return res;
}
};
(8)字符串转换整数(atoi)(中等)
实现思路:
本题思路十分简单,读清楚题目进行模拟即可。
具体代码实现如下:
class Solution {
public:
int myAtoi(string s) {
int k=0;
while(k<s.size() &&s[k]==' ')
{
k++;
}
if(k==s.size()) return 0;
int minus=1;
if(s[k]=='-')
{
minus=-1;
k++;
}
else if(s[k]=='+')
{
k++;
}
long long res=0;
while(k<s.size() && s[k]>='0' &&s[k]<='9')
{
res=res*10+s[k]-'0';
k++;
if(res>INT_MAX) break;
}
res*=minus;
if(res>INT_MAX) res=INT_MAX;
if(res<INT_MIN) res=INT_MIN;
return res;
}
};
(9)回文数(简单)
实现思路:与上述第7题思路相同
具体实现代码如下:
class Solution {
public:
bool isPalindrome(int x) {
if(x<0)
{
return false;
}
int temp=x;
long long res=0;
while(x)
{
res=res*10+x%10;
x/=10;
}
return res==temp;
}
};
(10)正则表达式匹配(困难)
实现思路:(如图所示)
具体代码实现如下:
class Solution {
public:
bool isMatch(string s, string p) {
int n=s.size(),m=p.size();
s=' '+s;p=' '+p;
vector<vector<bool>> f(n+1,vector<bool>(m+1));
f[0][0]=true;
for(int i=0;i<=n;i++)
{
for(int j=1;j<=m;j++)//s是可以是空字符串的(因为此时p中可以含有*),但是p是不可以为空字符串的
{
if(j+1<=m && p[j+1]=='*')
{
continue;
}//如果当前我们的字符是*的话,此时及时不可以单独进行使用的,因为*的含义复杂,所以我们继续往后进行讨论即可
if(i && p[j]!='*')//此时对应的就是图中的第一种情况
{
f[i][j]=f[i-1][j-1] &&(s[i]==p[j] || p[j]=='.');
}
else if(p[j]=='*')
{
f[i][j]=f[i][j-2] || i &&f[i-1][j]&& (s[i]==p[j-1]||p[j-1]=='.');
}
}
}
return f[n][m];
}
};