(每周10题)之 leetcode题目 ---(08~10)

      今天是本周的最后三道题目,从做题来看,发现自己能力还是达不到问题立刻解决最优,不过也是学习了,还有有点困难去做困难的题目,虽然有时候会有不知所措,或者解题方法不能够好,但是清楚认识到自己的问题,也是一件好事。不多说什么了,学到了就是赚到了。

第八题 :字符串转换整数 (atoi)

 解题思路:这个题目我没有多想法,就是根据情况来依次解决,最终达到我想要的结果,就是遍历一遍讨论情况,便可以解决问题,时间复杂度O(n).

代码:

int myAtoi(string str)
{
	int length = str.size();//获取字符串的长度
	int index = 0;  //当前下标
	int result = 0; //结果记录值
	bool flog = true; //true表示+ false表示 -
	while (str[index] == ' ')//若前面是空的情况下
	{
		index++;
	}
	if (str[index] == '-' || str[index] =='+')
	{
		if (str[index] == '-')
		{
			flog = false;
		}
		index++;
	}
	else if (!isdigit(str[index]))
	{
		return result;
	}
	
	for (;index < length && isdigit(str[index]);index++)
	{
		if (result > INT_MAX / 10 || (result == INT_MAX / 10 && str[index] - '0' > 7)) //溢出
		{
			return flog ? INT_MAX : INT_MIN;
		}
		result = result * 10 + (str[index] - '0');
	}

	return flog ? result : -1 * result;
}


void testmyAtoi()
{
	string  stf = "   -42";
	int data = myAtoi(stf);
	cout << data << endl;

}

 输出结果: -42

若看此题,也不算中等难度,这样解法算是简单类的,后来我看了答案,官方有限状态机(deterministic finite automaton, DFA)

的方法来区别end 与start,可以防止代码比较臃肿,但是基本想法还是一样。

感兴趣的小伙伴可以看:

https://leetcode-cn.com/problems/string-to-integer-atoi/solution/zi-fu-chuan-zhuan-huan-zheng-shu-atoi-by-leetcode-/

 第九题 :回文数

解题思路:这个题目很简单了本人之前也做过,回文数之前有回文字符串,这里可以采用翻转数据判断,就是要考虑翻转数据是否泄漏问题,也可以采用变成字符串的形式,本人采用的第一个方案:

bool isPalindrome(int x) {
	if (x < 0) return false;
	int num = x;
	int getnum = 0;
	while (num != 0)
	{
		if (getnum > INT_MAX / 10 || (getnum == INT_MAX / 10 && num % 10 > 7))
			return false;
		if (getnum < INT_MIN / 10 || (getnum == INT_MIN / 10 && num % 10 < -8))
			return false;
		getnum = getnum * 10 + num % 10;
		num /= 10;
	}
	return  x == getnum;
}

就是这么简单与枯燥,不过写代码也算很累了,慢慢加油吧。

第十题:正则表达式匹配

    bool isMatch(string s, string p) {
        int m = s.size();
        int n = p.size();

        auto matches = [&](int i, int j) {
            if (i == 0) {
                return false;
            }
            if (p[j - 1] == '.') {
                return true;
            }
            return s[i - 1] == p[j - 1];
        };

        vector<vector<int>> f(m + 1, vector<int>(n + 1));
        f[0][0] = true;
        for (int i = 0; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (p[j - 1] == '*') {
                    f[i][j] |= f[i][j - 2];
                    if (matches(i, j - 1)) {
                        f[i][j] |= f[i - 1][j];
                    }
                }
                else {
                    if (matches(i, j)) {
                        f[i][j] |= f[i - 1][j - 1];
                    }
                }
            }
        }
        return f[m][n];
    }

本题目为困难。暂时没有写,有时间不从说明。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值