classSolution { public: voidreverse(string& s, int i, int j){ while (i < j) { swap(s[i++], s[j--]); } } stringreverseWords(string s){ int i = 0, j = 0; while (s[j] != '\0') { if (s[j] == ' ') { reverse(s, i, j - 1); //反转每一个 i = j + 1; } j++; } reverse(s, i, j - 1); //处理上面的最后一次循环
//整体反转一次 reverse(s, 0, j - 1); return s; } };
字符串左旋转-题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转操作的功能。
比如输入字符串”abcdefg”和数字2,该函数将返回左旋转2位得到的结果”cdefgab”。
注意:
数据保证n小于等于输入字符串的长度。 样例 输入:”abcdefg” , n=2
输出:”cdefgab”
字符串左旋转-代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: voidreverse(string& s, int i, int j ){ //对撞指针,往中间凑 while (i < j) { swap(s[i++], s[j--]); } } stringleftRotateString(string str, int k){ int n = str.size(); if (k == 0) return str; reverse(str, 0, k - 1); reverse(str, k, n - 1); reverse(str, 0, n - 1); return str; } };
classSolution { public: vector<vector<int> > findContinuousSequence(int t){ int i = 1, j = 1; int sum = 0; for (int i = 1; i < t; i++) { //结束位置 for (j = 1; j < i; j++) { //开始位置 if (S[i, j] == t) { //add to result } } } return res; } };
classSolution { public: intadd(int num1, int num2){ while (num2) { /* 经过XOR操作后,1/0,0/1,0/0都已经符合预期了,只是1/1? 本来应该成为10,却变成了0? 我们怎样才能找回丢失的进位呢? 只有&操作才能将两个1变为1,也许是我们好的选择? 实际上,这就是计算机执行加法的底层原理。 */ int sum = num1 ^ num2; int carry = (num1 & num2) << 1; num1 = sum; num2 = carry; //用计算出来的结果重新赋值,有点辗转相除法的感觉。 } return num1; }
intsub(int num1, int num2){ //a - b = a + (-b) return add(num1, add(~num2, 1))) }
int mul(int a, int b) { //最笨的方法是for循环--b次; 有没有更好的办法呢? //都转为正数先 int a1 = a >= 0 ? a : add(~a, 1); int b1 = b >= 0 ? b : add(~b, 1); int sum = 0; //整个过程跟手动乘法类似 while (b1) { if (b1 & 0x01) { sum = add(sum, a1); } a1 <<= 1; b1 >>= 1; }
//异号,相反数 if (a ^ b < 0) { sum = add(-sum, 1); }
return sum; }
intdiv(int a, int b, int& reminder){ int r = 0; //都转为正数先 int a1 = a >= 0 ? a : add(~a, 1); int b1 = b >= 0 ? b : add(~b, 1); for (int i = 31; i >= 0; i--) { if ((a1 >> i) >= b1) { // a >= (b << i) r = add(r, 1 << i); a1 = sub(a1, b1 << i); } }
classSolution { public: intfindMin(vector<int>& nums){ if (nums.empty()) return-1; int n = nums.size() - 1; //特判 while (nums[0] == nums[n]) {n--;} //特判 if (nums[0] <= nums[n]) { return nums[0]; } //二分模版 int l = 0, r = n; while (l < r) { int mid = l + r >> 1; if (nums[0] > nums[mid]) r = mid; else l = mid + 1; } return nums[r]; } };