zoukankan      html  css  js  c++  java
  • 【C++】leetcode竞赛笔记

    *注——代码非博主本人所写,仅供学习参考,侵删

    20200516双周赛:

    1  to_string(int a)          将a转换成字符串形式

    2  gcd(int a,int  b)          返回a,b的最大公约数,若返回1则表示a/b不可再约分

    3  string +             字符串可以直接用+号来连接

    4  vector<vector<int> > vec(N, vector<int>(M));

                       建立[N][M]二维 数组

    20200517周赛

    1  split(const string &s, char stop) 把字符串s用stop分离

    vector<string> split(const string &s, char stop){
        vector<string> ret;string t;
        for (auto c : s)if(c == stop){ret.push_back(t);t = "";}else{t += c;}  
        ret.push_back(t);
        return ret;
    }

    2  isupper(char c)        判断c是否是大写字母

    3  sort(a,b,cmp)        对数组进行排序a表示起始位置,b是结束位置,cmp是排序标准的函数

    //利用数组a对数组v简介排序,a中储存v的下标,排序a,然后按照a中的先顺序输出v,可以保证v位置不变
    sort(a.begin(), a.end(), [
    &](int i, int j){//匿名函数,[&]表示参数按引用捕获
        //i表示排序后的位置在前的数,j表示排序后位置在后的数数
    return v[i].size() < v[j].size() || v[i].size() == v[j].size() && i < j;//return 返回想要的结果
        //v[i].size() < v[j].size()  要求前短后长
        //v[i].size() == v[j].size() && i < j  要求前后通常的情况下,前面的 还是在前面(保持原来位置) } );

    4  includes(bb.begin(),bb.end(),aa.begin(),aa.end()) 判断数组a是不是数组b的子集 

        int a[6]={1,2,3,4,5,9};
        int b[7]={1,2,3,4,5,9,8};
        vector<int> aa(a,a+6);
        vector<int> bb(b,b+7);
        sort(aa.begin(),aa.end());
        sort(bb.begin(),bb.end());
        bool f=includes(bb.begin(),bb.end(),aa.begin(),aa.end());

    5  unordered_map查找复杂度O(n),普通map查找复杂度O(nlogn)

    6  dfs,bfs的标记需要引用传参&,不能用形参

    void fun(vector<vector<bool>>& bl,queue<node *>& que,vector<vector<int>>& m)
    
    7
        !是逻辑运算符(与||,&&是一类符号),表示逻辑取反,可以把非0值变成0,把0值变为1
        ~是位运算符(与|,&是一类符号),表示按位取反,在数值的二进制表示上,将0变为1,将1变为0

    8  int 是进行拷贝构造,而const int & 是返回的引用- 拷贝构造更消耗时间,与此同时还用析构函数。因此for (const int& num : nums)比for (int num : nums)更快

    9  ans+=n&1;与ans=ans+n&1;的结果不同_原因:加号的优先级大于位与的优先级,后面一个应该写成ans = ans + (n & 1)

    10  在处理大量数据时数组速度远超vector速度,以下是建立数组的代码

    bool * isp=new bool [n];
    delete[] isp;

    11  map可以使用map<map<char,int>,int>嵌套,而unordered_map不能使用嵌套

    12  变量初始化  int start(0)  强制类型转换  char tmpChar = s[end];vec[int(tmpChar)] = end;

    13  set<int> st;auto it = st.upper_bound(4);找set中第一个比4大的数

    14  Set.contains(e)  查找set中是否含有e,返回布尔值

    15  (v%k + k) % k  正确取模方法,包含正数和负数

    16  快速去重
      set<int> st(vec.begin(), vec.end());
      vec.assign(st.begin(), st.end());

    17  for(;;)速度比while(1)快

    18  特殊数据结构初始化

        vector<string> t={"a","b"};

        map<int,int> m={{1,2},{3,4}};

    19  multiset是<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数

    20   查找字符串中某字符第一次出现的位置 int pos=s.find('e'); if(pos == string::npos)
    21  set可以用作滑动窗口
        set.lower_bound(4)//查找第一个大于等于4的元素,返回此元素迭代器,未找到返回set.end()
        set.upper_bound(4)//查找第一个大于4的元素,返回此元素迭代器,未找到返回set.end()

    22  树集合,Java 中的 Treeset 或者 C++ 中的 set ,是由高度平衡的二叉搜索树实现的。因此,搜索、插入和删除的时间复杂度都是 O(logN)

       散列集合,Java 中的 HashSet 或者 C++ 中的 unordered_set ,是由哈希实现的,当存在具有相同哈希键的元素过多时,将花费 O(N) 时间复杂度来查找特定元素
       哈希集和树集之间的本质区别在于树集中的键是有序的。

    23  输出数组的全排列

         vector<vector<int>>res;
            sort(nums.begin(),nums.end());
            do{res.push_back(nums);}  
            while(next_permutation(nums.begin(),nums.end()));
            return res;

    24  for(int i=10;i>=0;i--)等效于for(int i=10;~i;i--)  注意~i=-1-i

    25  using ll = long long;

    26  在 C++ 中 set/multiset 是有序的集合,它们是基于红黑树实现的。其中 set 会对元素去重,而 multiset 可以有重复元素。

     
     
  • 相关阅读:
    关于Jonathan S. Weissman与RIT(罗切斯特理工学院,位于纽约)
    jQuery获取元素值以及设置元素值总结
    页面跳转
    Node JS复制文件
    js获取当前日期并格式yyy-MM-dd
    Json文件删除元素
    HTML页面间传值
    计算机实用但冷门快捷键
    NodejS---require的机制
    Node某个JS导出方法变量以及在其他地方引用的例子
  • 原文地址:https://www.cnblogs.com/LPworld/p/12903203.html
Copyright © 2011-2022 走看看