Leetcode究极刷题笔记(6~10)

(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];
    }
};

 希望以上文章对您有帮助!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抱着太阳吃雪糕z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值