给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
这道题实实在在是很简单的一道题,但是我实实在在错了几次,有很多情况没考虑到。而在改错或者说打补丁的过程中又没有审视全局导致改的根本不彻底。这道题给我的教训就是思维要严谨吧。因此我还是为这道题专门写了一篇博客以整理我的思路,以期下次不再发生这样的错误。
几种情况:
1.很普通,一左一右,或者嵌套这种([{}]),左括号入栈,右括号检查栈顶有没有匹配的左括号啊,如果有,左括号出栈,如果没有,那就说明匹配不了。
2.但是这是不严谨的,左括号多了没什么事,最后返回的时候只要加上一个判断栈是否为空就可以解决右括号少的问题。一旦右括号多了,就会发生访问空栈顶元素的情况,那是个严重错误。
3.所以说要时刻警惕有没有越界
遇见左括号,入栈
遇见右括号:1.栈空,FALSE 2.不空(1)匹配,出栈(2)不匹配,FALSE
最后,判断栈是不是空的,整个时间渐进复杂度也就是吧
下一个题是中等题,总归还是转换思路,不落下每一种情况就是胜利。(不贴示例了)
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/string-to-integer-atoi
现在先缕清思路,看看写的时候能不能一遍过:
1.必然是需要从前往后遍历,因为如果从后往前的话,虽然是在计算方面有所简化,但是可能后面跟了一堆无用的字符,所以综合起来根本不会提高性能,而且我认为会给自己找麻烦。
2.前导空格和中间的空格,数字和符号已经出现之后仍然可以出现空格,那我就要记录一下现在出现的空格是应该忽略还是应该结束,那么,留下一个spacetag,如果不是前导空格,置0就是了。这是空格的问题解决了。
3.符号:这个问题就更简单了,识别是什么符号就是什么符号,只要第一个,我的sizetag初始化成一个啥也不是的东西,但凡出现了正负号,即便扫描到的还是正负号也要让他结束循环。如果已经有数字了,并且数字前没出现符号,那么sizetag置成+,意思就是你再出现符号我也不认了。
4.溢出,按规定来,这个比有符号数在计算机上的溢出还简单的多,只要判断大小就行,没什么技术含量。
5.数字后面的非数字,直接break
倒是都写对了,只是有一个问题。
long long int p = a;//type a is int
p = p * 10 + temp;
//上面这样写比较好
long long int p = a * 10 + temp;
//这样写会报错,原因是a*10还是一个int型,加上temp,然后执行等号左边,这个和才被转成long long,因此还是会溢出,这条语句只能分成两行写才是正确的。