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