刷算法题时发现的一些小贴士

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 }

 

posted @ 2018-06-06 21:40  yuanninesuns  阅读(140)  评论(0编辑  收藏  举报