刷题小技巧(一)

不同位数相加时的技巧

相加算法是我自己定义的名字,具体问题如下:假设每次循环返回一个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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值