6月中下旬辞职在家,7 月份无聊的度过了一个月。8 月份开始和朋友两个人写项目,一个后台和一个 APP ,APP 需要对接蓝牙打印机。APP 和蓝牙打印机都没有搞过,开始打算使用 MUI 开发 APP ,这样学习成本会低一些。但是蓝牙打印机的供应商不提供打印机的指令集,只提供了原生 Android 的 SDK ,因此无奈必须要学习 Android 的原生开发。8 月份加油啊!
LeetCode 题库的第 28 题——实现strStr()
题目如下:
解题代码
该题就是两层循环,第一层循环主要是遍历字符串,第二层循环用来进行匹配。实现代码如下:
1 int strStr(char* haystack, char* needle) { 2 int pos = -1; 3 int str1len = strlen(haystack); 4 int str2len = strlen(needle); 5 6 int i, n, j; 7 8 if ( str2len == 0 ) { 9 return 0; 10 } 11 12 for ( i = 0; i < str1len; i ++ ) { 13 n = i; 14 for ( j = 0; j < str2len; j ++ ) { 15 if ( haystack[n++] == needle[j] ) { 16 if ( j == str2len - 1 ) { 17 pos = i; 18 goto EXIT; 19 } 20 } else { 21 break; 22 } 23 } 24 } 25 EXIT: 26 return pos; 27 }
以上是我的解题代码,就是使用两层来进行实现,没有太好的思路,所以解题思路就没什么可说的了。上面的代码,其实还可以减少循环的次数,但是会增加一些代码量,LeetCode 对以上代码执行的时间显示为 1800 多毫秒。那么就增加一个判断,让循环次数少一些,增加的代码如下:
1 for ( i = 0; i < str1len; i ++ ) { 2 if ( str1len - i < str2len ) { 3 return pos; 4 } 5 n = i; 6 for ( j = 0; j < str2len; j ++ ) { 7 if ( haystack[n++] == needle[j] ) { 8 if ( j == str2len - 1 ) { 9 pos = i; 10 goto EXIT; 11 } 12 } else { 13 break; 14 } 15 } 16 }
看上面的代码,只是在第一层的 for 循环中增加了一个判断,但是 LeetCode 给出的执行时间是 0 毫秒,是不是很惊人?为什么会这样呢?原因其实很简单,当 needle 很短的时候这个判断是没有太大差别的,但是当 needle 特别长的时候,减少的循环次数就非常明显了。
欢迎大家关注微信公众号:“码农UP2U”