150.逆波兰表达式
最先想到肯定是栈,我原先想用循环迭代,发现如果前面连续的数字较多(超过2个),迭代的变量就更新不了了,导致前面的数也没了。
所以还是得用栈保存每个数。
要用atoi函数正负数由字符串转化过来。
除法考虑负数如何保留整数部分,我用了floor函数,不过没用也能通过。
另外不能以字符串第一个字符判断是5种字符串,因为负数和减都是以‘-’开头。
以整个字符串为判断依据,之前要用strcmp判断是否符合。
特殊情况,一个数,直接返回。
14.最长公共前缀
看起来很简单的一道题,感觉主题算法不难,但可能性一直没完全包进去,结果做了一个多小时就看答案。真心烦òᆺó
后来按自己的代码又分类讨论,看原来代码搞得跟屎山一样,搞半天各种可能性都没包括进去,一直显示一些例子不合格。显然,盲目分类讨论(if)无效,最后用了6个if语句,4个break语句都不行。无语。
看答案吧。
char * longestCommonPrefix(char ** strs, int strsSize){
int len=200,flag=0,i=0,j=0;
for(i=0;i<strsSize;i++)
len=fmin(len,strlen(strs[i]));
if(len==0||strs==NULL)
return "";
if(strsSize<2)
return strs[0];这几种是特殊情况,也很容易忽略。
for(;;j++){
for(i=1;i<strsSize;i++)
if(strs[i][j]!=strs[0][j]||strs[i][j]=='\0'){
这是一段很优雅的循环,比我的好到不知道哪去。
flag=1;
break;}
if(flag==1){
*(strs[0]+j)='\0';
break;}
i=1;这句很容易忘,很重要的一步。
}
return strs[0];
}
所以说如果发现数组越界,但迟迟找不出bug,就是自己忽略了一些细节,一些情况,把例子想简单了,如果在原基础上修改,加各种if,可能任然不行,那原始思路基本上有问题,有较大的漏洞,这种时刻不要💩磕那一种算法,换一个思路。