LeetCode究极刷题班( 八 )

< m; i++) {//如果新加入的字符不能匹配 , j一直回退while(j != -1 && needle[i] != needle[j + 1]) j = ne[j];//如果新加入的字符能够匹配 , 最长字串长度增加 , 继续匹配if(needle[i] == needle[j + 1]) j++;ne[i] = j;}//KMP处理,和上面处理思想一致for(int i = 0, j = -1; i < n; i++) {while(j != -1 && haystack[i] != needle[j + 1]) j = ne[j];if(haystack[i] == needle[j + 1]) j++;if(j == m - 1) {return i - j;}}return -1;}};
29. 两数相除
思想
我们以147 / 3 = 49为例 , 49的二进制表示 =
由此我们可以借助二进制表示 , 提前存储好所有2^k * 的情况 , 题目条件限制比较多 , 只能使用int类型 , 并且考虑到正数范围比负数小 , 所以我们在处理的时候统一使用负数来处理 。在处理过程中需要及时考虑边界条件溢出的情况 。
class Solution {public:int divide(int x, int y) {bool flag = (x > 0) ^ (y > 0);if (x > 0) x = -x;if (y > 0) y = -y;vector> tmpadd;for(int i = y, j = -1; i >= x; i += i, j += j) {tmpadd.emplace_back(i, j);if(i < (INT_MIN >> 1)) break;}int res = 0;for(int i = tmpadd.size() - 1; i >= 0; i--) {if(tmpadd[i].first >= x) {res += tmpadd[i].second;x -= tmpadd[i].first;}}if(!flag) {if(res == INT_MIN) return INT_MAX;res = -res;}return res;}};
?这个专栏将会持续更新题解和思路分享 , 欢迎留言交流!