1.不同位数相加时的技巧
相加算法是我自己定义的名字,具体问题如下:假设每次循环返回一个int,第一次返回1,第二次返回2,第三次返回3,最后算法的结果是123,如何计算?
这个 问题看似简单其实有一个问题,就是你并不知道循环的次数是多少,也就是说无法确定1乘以的究竟是10的几次方,下面介绍两种方法:
方法一:
用stack的思想,把每次循环的值都存在stack中,这样以先进后出的性质,最后只需要每次pop出一个值,先乘以1,再依次乘以10,100,1000即可算出123
方法二:
这个方法比较巧妙,就是令val=val*10+x;其中val初始化为0,x为每次循环的值。这样的话就不需要借助额外的存储空间了。
2.&的妙用
比如下面这段代码,最后的输出是ans,我需要ans随着递归的每一层的进行都改变它的值,而且改变其真正的值,这时候就要在方法实现的时候在ans前面加上&。但是k是一个临时变量,在计算每一条路径时都会有不同的值,我希望递归的每一层都会改变k的值,但是却不影响上一层的递归,即这层递归结束后k还是原来上一层递归的值,这时候再在方法实现的时候就不需要在k之前加&
1 int minDepth(TreeNode* root) { 2 if (!root) 3 return 0; 4 int ans = INT_MAX; 5 int k = 1; 6 dfs(root,ans,k); 7 return ans; 8 } 9 void dfs(TreeNode* root, int &ans, int k) { 10 if (root->left == NULL && root->right == NULL) { 11 ans = min(k,ans); 12 return; 13 } 14 if (root->left || root->right) 15 k++; 16 if (root->left) 17 dfs(root->left, ans, k); 18 if (root->right) 19 dfs(root->right, ans, k); 20 }
3.字符串倒序
1 #include<string> 2 int main() 3 { 4 string str="cvicses"; 5 string s(str.rbegin(), str.rend()); 6 cout << s << endl; 7 return 0; 8 }
4.自定义数据结构的排序
1 #include<algorithm> 2 sort(pairs.begin(), pairs.end(), [](vector<int>& a, vector<int>& b) { 3 return a[0] < b[0]; 4 });
5.全排列
1 #include <iostream> 2 using namespace std; 3 void swap(int &a, int &b) { 4 int temp = a; 5 a = b; 6 b = temp; 7 } 8 void perm(int list[], int low, int high) { 9 if (low == high) { //当low==high时,此时list就是其中一个排列,输出list 10 for (int i = 0; i <= low; i++) 11 cout << list[i]<<" "; 12 cout << endl; 13 } 14 else { 15 for (int i = low; i <= high; i++) {//每个元素与第一个元素交换 16 swap(list[i], list[low]); 17 perm(list, low + 1, high); //交换后,得到子序列,用函数perm得到子序列的全排列 18 swap(list[i], list[low]);//最后,将元素交换回来,复原,然后交换另一个元素 19 } 20 } 21 } 22 int main() 23 { 24 int list[] = { 1,2,3,4,5,6,7,8,9 }; 25 perm(list, 0, 4); 26 return 0; 27 }