LeetCode 实践练习6-10

LeetCode—6

在这里插入图片描述
思路:通过从左向右迭代字符串,我们可以轻松地确定字符位于Z字形团中的哪一行。
算法:从左到右迭代s,将每个字符添加到合适的行。可以使用当前行和当前方向这两个变量对合适的行进行跟踪。只有当我们向上移动到最上面的行或向下移动到最下面的行时,当前方向才会改变。

C++解法:

class Solution {
public:
    string convert(string s, int numRows) {

        if (numRows == 1) return s;

        vector<string> rows(min(numRows, int(s.size())));
        int curRow = 0;//当前行
        bool goingDown = false;//方向

        for (char c : s) {
            rows[curRow] += c;
            if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;//若是第一行或是最后一行
            curRow += goingDown ? 1 : -1;//判断方向向上-1向下+1
        }

        string ret;
        for (string row : rows) ret += row;
        return ret;
    }
};

LeetCode—7

在这里插入图片描述
为什么会存在溢出问题呢,我们知道int型的数值范围是 -2147483648~2147483647, 那么如果我们要翻转 1000000009 这个在范围内的数得到 9000000001,而翻转后的数就超过了范围。

C++解法:

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        while (x != 0) {
            if (abs(res) > INT_MAX / 10) return 0;//解决溢出问题
            res = res * 10 + x % 10;
            x /= 10;
        }
        return res;
    }
};

LeetCode—8 字符串转换整数

在这里插入图片描述
在这里插入图片描述
C++解法:

class Solution {
public:
    int myAtoi(string str) {
        if (str.empty()) return 0;
        int sign = 1,base = 0,i = 0,n = str.size();
        while(i<n && str[i] == ' ') i++;
        if(str[i] == '+' || str[i] == '-') {
            sign = (str[i++] == '+') ? 1 : -1;
        }
        while(i<n && str[i] >= '0' && str[i] <= '9'){
            if(base > INT_MAX/10 || (base == INT_MAX/10 && str[i] - '0' > 7)){
                return (sign == 1) ? INT_MAX : INT_MIN;
            }
            base = base * 10 + (str[i++] - '0');
        }
        return (sign*base);
    }
};

LeetCode—9 回文数(关联第5题)

在这里插入图片描述
思路:不能为负数 不为的数字且最低位不可以为0 这两个条件就是不是回文。
再利用函数反转,溢出则一定不是回文 ,然后在判断反转后与原来数字相同与否。
C++代码:

class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0 || (x % 10 == 0 && x != 0)) return false;
        return reverse(x)==x;
    }
    int reverse(int x){
        int res = 0 ;
        while(x != 0){
            if(res > INT_MAX/10) return -1;
            res = res * 10 + x%10;
            x /= 10;
        }
        return res;
    }
};

LeetCode—10 正则表达式匹配

在这里插入图片描述在这里插入图片描述
思路:解法链接
C++解法:

class Solution {
public:
    bool isMatch(string s, string p) {
        if (p.empty()) return s.empty();
        if (p.size() == 1) {
            return (s.size() == 1 && (s[0] == p[0] || p[0] == '.'));
        }
        if (p[1] != '*') {
            if (s.empty()) return false;
            return (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p.substr(1));
        }
        while (!s.empty() && (s[0] == p[0] || p[0] == '.')) {
            if (isMatch(s, p.substr(2))) return true;
            s = s.substr(1);
        }
        return isMatch(s, p.substr(2));
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值