8、String to Integer (atoi)
题目
这道题目关键是要考虑清楚各种输入用例。针对每一种情况,函数都能处理,也就是函数鲁棒性很高。代码如下:
1 class Solution { 2 public: 3 int myAtoi(string str) { 4 int index=0; 5 int flag = 1; 6 long long res=0; 7 if(str.length()==0)return 0; 8 while (str[index]==' ')//去除空白 9 index++; 10 11 if(str[index] == '-')//负数 12 { 13 flag = -1; 14 index++; 15 } 16 else if(str[index] == '+')//负数 17 { 18 flag = 1; 19 index++; 20 } 21 int len = str.length(); 22 while (str[index]>='0'&&str[index]<='9') 23 { 24 res = res * 10 +str[index]-'0'; 25 if(res > INT_MAX) 26 return flag>0 ? INT_MAX:INT_MIN; 27 index++; 28 } 29 30 return res*flag; 31 } 32 };
----------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------
9、Palindrome Number
题目
话不多说,直接看代码:
1 class Solution { 2 public: 3 bool isPalindrome(int x) { 4 if (x == -2147483648) 5 { 6 return false; 7 } 8 if (x<0) 9 { 10 //x=0-x; 11 return false; 12 } 13 int length = (int)log10(x*1.0)+1;//判断x的位数 14 //int s[20]; 15 int temp1 = x; 16 int temp2 = x; 17 int middle = length/2; 18 int i,j,left,right,power=length-1; 19 for (i=1;i<=middle;i++) 20 { 21 left=temp1/(int)pow(10.0,power); 22 temp1=temp1%(int)pow(10.0,power); 23 power--; 24 25 right = temp2%10; 26 temp2 = temp2/10; 27 if (left != right) 28 { 29 return false; 30 } 31 32 } 33 return true; 34 } 35 };
--------------------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------
10、Regular Expression Matching
题目
这道题目,一开始我以为要用到编译原理里面学到的自动机构造方法,后来在网上看别人的解题思路,其实可以采用递归的方法直接进行匹配,其思路是这样的;
思路1:递归。根据下一个字符是否是'*'分情况判断。
- 如果p的下一个字符不是'*',只需判断当前字符是否相等,或者p[cur]='.',递归处理s[1]和p[1];
- 如果是p的下一个'*',则当前s和p相等或者p='.'情况下,依次判断s[0...s.length]和p2]是否match;
实现代码可以参考如下:
1 class Solution { 2 public: 3 bool isMatch(string s, string p) { 4 return isMatch(s.c_str(),p.c_str()); 5 6 } 7 bool isMatch(const char *s, const char *p) { 8 // Start typing your C/C++ solution below 9 // DO NOT write int main() function 10 if (*p == 0) return *s == 0; 11 if (*(p+1) != '*') 12 { 13 if (*s != 0 && (*p == *s || *p == '.')) return isMatch(s+1, p+1); 14 else return false; 15 } 16 else 17 { 18 // *s == *p 19 while (*s != 0 && (*s == *p || *p == '.')) 20 { 21 if (isMatch(s, p+2)) return true; 22 s++; 23 } 24 return (isMatch(s, p+2)); 25 } 26 } 27 };
当然,这道题还可以采用自动机进行解决,不过难度也是很大的,需要对模式串进行分析,构造出自动机,然后通过s串逐个字符的匹配。下面是最开始未完成的代码:
1 class node 2 { 3 public: 4 node() 5 { 6 val = 0; 7 self = -1; 8 isEnd = false; 9 10 } 11 node(char c) 12 { 13 val = c; 14 self = -1; 15 isEnd = false; 16 } 17 18 public: 19 char val; 20 int self;//是否包含* 21 bool isEnd;//是否是终态 22 23 24 }; 25 26 27 class Solution { 28 public: 29 bool isMatch(string s, string p) 30 { 31 if("" == s) 32 return true; 33 if("" == p) 34 return false; 35 vector<node*> status;//存储自动机状态节点 36 node *temp; 37 38 temp = new node(p[0]); 39 status.push_back(temp); 40 41 int i=1; 42 int index = 0; 43 while (p[i] != '