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


    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 }
  • 相关阅读:
    关于FileUpload控件的二种用法,你都懂吗?
    Application全局对象 实现统计当前在线人数和总访问次数
    使用COOKIE对像实现保存用户基本信息(结合Session),ASP.Net实现用户登录全过程
    递规篇历路径之 使用正则过滤( 将符合正则的名称用另种正则格式替换掉 )某个路径下的所有文件或文件夹的完整路径
    小偷程序之网页分块筛选
    c#中的socket编程基础
    ASP.Net中的一些基础家常事
    PHP数组
    Effective C++总结
    构造函数、析构函数、虚函数可否内联,有何意义
  • 原文地址:https://www.cnblogs.com/yuanninesuns/p/9147521.html
Copyright © 2020-2023  润新知