20
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
自解
#include "string.h"
bool isValid(char * s){
char* stact = (char*)malloc(sizeof(char) * strlen(s));
int i =0;
int j =-1;
while(s[i] != '\0')
{
if(j == -1)
{
j++;
stact[j] = s[i];
}
else
{
if(s[i] - stact[j] == 1 || s[i] - stact[j] == 2)
{
j--;
}
else
{
j++;
stact[j] = s[i];
}
}
i++;
}
if(j == -1)
{
return true;
}
return false;
}
总结
官方解看了下,用了什么哈希表,没学到,先不管了,说说自己的结题思路吧。其实就是一个栈的入栈与出栈,只是自己没做过栈相关的题,第一次看到有点陌生罢了,甚至不记得栈的定义了。用数组实现栈时,一般栈顶在-1处,表示栈为空,来一个元素,栈顶加一并且赋值。出栈就栈顶减1就完事了,没什么好说的。重点说下遇到的一个BUG吧,char* stact = (char*)malloc(sizeof(char) * strlen(s));在申请内存的时候出现了一个BUG,申请的长度我开始写的是sizeof(*s),好像不对,具体原因不知道,以后就申请单个元素大小乘以元素个数吧。
写着写着发现个事,自己没有free,这个习惯好坏啊,以后一定得改,谁申请谁释放啊!!!
150
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
自解
int evalRPN(char ** tokens, int tokensSize){
int* stack = (int*)malloc(sizeof(int) * tokensSize);
int resutl = 0;
int j =-1;
for(int i = 0; i < tokensSize;i++)
{
if(tokens[i][0] == '+')
{
stack[j-1] = stack[j] + stack[j-1];
j--;
}
else if((tokens[i][0] == '-') && (tokens[i][1] == '\0'))
{
stack[j-1] = stack[j-1] - stack[j];
j--;
}
else if(tokens[i][0] == '*')
{
stack[j-1] = stack[j] * stack[j-1];
j--;
}
else if(tokens[i][0] == '/')
{
stack[j-1] = stack[j-1] / stack[j];
j--;
}
else
{
j++;
stack[j] = atoi(tokens[i]);
}
}
resutl = stack[0];
free(stack);
stack = NULL;
return resutl;
}
官方解
bool isNumber(char* token) {
return strlen(token) > 1 || ('0' <= token[0] && token[0] <= '9');
}
int evalRPN(char** tokens, int tokensSize) {
int n = tokensSize;
int stk[n], top = 0;
for (int i = 0; i < n; i++) {
char* token = tokens[i];
if (isNumber(token)) {
stk[top++] = atoi(token);
} else {
int num2 = stk[--top];
int num1 = stk[--top];
switch (token[0]) {
case '+':
stk[top++] = num1 + num2;
break;
case '-':
stk[top++] = num1 - num2;
break;
case '*':
stk[top++] = num1 * num2;
break;
case '/':
stk[top++] = num1 / num2;
break;
}
}
}
return stk[top - 1];
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/solution/ni-bo-lan-biao-da-shi-qiu-zhi-by-leetcod-wue9/
来源:力扣(LeetCode)
总结
这个题目看着不难,而且以前做过类似的一个题目,大致的流程是相当的清楚的。但是,今天做这个题目的时候,整个过程漏洞百出:其一,进行计算的时候,出入栈的顺序没留一个心眼,减法和除法运算是有顺序的啊喂!!其二,没有考虑“-”的特殊情况,我开始是采用的判断每个字符串第一个字符来判断执行的操作,这个时候,有个必然的巧合没注意到,减法运算和负数,这两个没有进行区分,所以在这之间一直报栈溢出的错误。并且由这个判断方式啊,引出了一个很有趣的东西,运算优先级和运算顺序的问题,具体见大佬的博客:C/C++逻辑运算符 | | 和 && 的优先级误区——优先级决定运算顺序吗?_Italink的博客-CSDN博客_c++逻辑运算符 优先级
而我这个判断的问题是,&&和==问题,说的是一个表达式不能有多个bool,具体原因不太清楚了,但是在等式上面加括号就完美解决了,遇事不急加括号。具体见这个博主:error:lvalue required as left operand of assignment_叫毛哥的博客-CSDN博客
官方解和我的思路差不多,就不多说了。