2016.6.18——Implement strStr()
Implement strStr()
本题收获:
1.考虑多种边界条件。
2.haystack.size() size_type 是无符号的,即为正数
在32位系统上定义为 unsigned int
在64位系统上定义为 unsigned long
两个size相减若<0,则直接出现以下情况:
并不是负数,这里就会出现越界。
3.查看多行断点,设置监视来查看相应的值及类型。
题目:
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
思路:
注意题目中并没有说haystack.size() 一定大于needle.size()
我的思路:暴力搜索,利用两个for循环,逐个对比,没有考虑有些边界条件。
leetcode: 暴力搜索,但是考虑充分了边界条件
需要考虑的边界条件: haystack ,needle
1." " , " " 输出0
2." " , "a" 输出 -1
3."a" , " " 输出0
4."mississippi" , "issip" 输出4
5."aa" , "aaaa" 输出-1
6."a" , "a" 输出0,注意正常时,是从0开始还是1开始(第一个位置到底是0还是1)
代码:正确的代码
1 class Solution { 2 public: 3 int strStr(string haystack, string needle) { 4 int m = haystack.length(), n = needle.length(); 5 if (!n) return 0; 6 for (int i = 0; i < m - n + 1; i++) { 7 int j = 0; 8 for (; j < n; j++) 9 if (haystack[i + j] != needle[j]) 10 break; 11 if (j == n) return i; 12 } 13 return -1; 14 } 15 };
特殊情况:haystack:mississippi needle:issip
我的代码:
1.思路有问题
1 class Solution { 2 public: 3 int strStr(string haystack, string needle) { 4 if (haystack.size() == 0 && needle.size() == 0) return 0; 5 if (haystack.size() != 0 && needle.size() == 0) return 0; 6 if (haystack.size() == 0 && needle.size() != 0) return -1; 7 int n = 0; 8 int j = needle.size(); 9 for (size_t i = 0; i < haystack.size(); i++) 10 { 11 for (size_t j = 0; j < needle.size(); j++) 12 { 13 if (needle[j] != haystack[i]) 14 { 15 j = 0; 16 n++; 17 break; 18 } 19 } 20 return n - needle.size() + 1; 21 } 22 23 } 24 };
很多边界条件都不符合,每次测试加一个if语句,代码冗余度越来越高,如果加了两个if语句还有错就需要考虑是不是思路的问题了。
测试全代码:
有个问题:我不用m = haystack.size(),和n = needle.size()时,需要加if语句判断haystack.size(),needle.size()的大小,但是用m,n后就不需要加if语句,为什么????
相减在加1后超过 unsigned long的取值范围(unsigned long 0~4294967295),故会出现如下报错——指针越界
1 // Implement strStr().cpp : 定义控制台应用程序的入口点。 2 //考虑多点测试条件 3 // 4 5 #include "stdafx.h" 6 #include "iostream" 7 #include "stack" 8 using namespace std; 9 10 class MyClass 11 { 12 public: 13 int strStr(string haystack, string needle) //师兄的代码中哪里隐含了haystack.size() >= needle.size()???? 14 { 15 if (needle.size() == 0) return 0; 16 int m = haystack.size(), n = needle.size(); //为什么修改之后就可以了 17 //if (haystack.size() >= needle.size()) 18 //{ 19 for (int i = 0; i < m-n+1; i++) 20 { 21 int j = 0; 22 for (; j < needle.size(); j++) 23 { 24 if (haystack[i + j] != needle[j]) 25 break; 26 } 27 if (j == needle.size()) 28 { 29 return i + 1; 30 } 31 } 32 //} 33 return -1; 34 } 35 }; 36 37 /* 38 class MyClass { 39 public: 40 int strStr(string haystack, string needle) { 41 int m = haystack.length(), n = needle.length(); 42 if (!n) return 0; 43 for (int i = 0; i < m - n + 1; i++) { 44 int j = 0; 45 for (; j < n; j++) 46 if (haystack[i + j] != needle[j]) 47 break; 48 if (j == n) return i; 49 } 50 return -1; 51 } 52 };*/ 53 54 55 int _tmain(int argc, _TCHAR* argv[]) 56 { 57 string hay = "abb"; 58 string need = "abaaa"; 59 MyClass solution; 60 int m = 0; 61 m = solution.strStr(hay, need); 62 cout << m << endl; 63 system("pause"); 64 return 0; 65 }
调试:
1.设置断点,在行的前面单击即可设置断点,在单击以下就删除断点,如下图:
2.设置完一个断点后,若想看其他的值,重新设置断点比较麻烦,可以用菜单中的逐语句(F10),每次可以向下一行,查看相应值。
3.设置监视,设置完断点之后,在添加监视,可以看到,需要监视的元素目前的值。(一定是在添加完断点之后,如果添加完后,重新调试则不会出现相应的值,按下”监视“-“值”中的刷新即可,)
posted on 2016-06-18 18:25 zhuzhu2016 阅读(144) 评论(0) 编辑 收藏 举报