classSolution { public: intsingleNonDuplicate(vector<int>& nums){ int l = 0, r = nums.size()-1; while(l < r){ // 这样可以放心取m+1不越界 int m = (l + r) >> 1; if(nums[m] != nums[m+1]){ if((r-m) & 1) l = m + 1; else r = m; }else{ if((r-m-1) & 1) l = m + 2; else r = m - 1; } } return nums[l]; } };
classSolution { public: intfindPeakElement(vector<int>& nums){ int l = 0, r = nums.size()-1; while(l <= r){ int m = (l + r) / 2; if(m-1>=0 && nums[m-1]>nums[m]) r = m - 1; elseif(m+1<nums.size() && nums[m+1]>nums[m]) l = m + 1; else return m; } return0; // 永远不会走 } };
classSolution { public: string addtion(string& num1, string& num2){ int m = num1.size()-1, n = num2.size()-1; int c = 0; string ret; while(m>=0 || n>=0 || c){ int a = m>=0 ? num1[m]-'0' : 0; // 越界定0技巧 int b = n>=0 ? num2[n]-'0' : 0; // 越界定0技巧 int s = a + b + c; ret.push_back('0' + s % 10); c = s / 10; --m, --n; } reverse(ret.begin(), ret.end()); // 反转 return ret; } string multiply(string num1, string num2){ if(num1=="0" || num2=="0") return"0"; string res = "0"; int cnt = 0; // 记录表示每次乘完左移的0的个数 int m = num2.size()-1; while(m >= 0){ int n = num1.size()-1; int b = num2[m] - '0'; int c = 0; string ret(cnt, '0'); // 初始化"左移"0 while(n>=0 || c){ int a = n>=0 ? num1[n]-'0' : 0; // 越界定0技巧 int s = a * b + c; ret.push_back('0' + s % 10); c = s / 10; --n; } reverse(ret.begin(), ret.end()); // 反转 res = addtion(res, ret); --m, ++cnt; } return res; } };