经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
如何用C++制作LeetCode刷题小技巧-错题记录本
来源:jb51  时间:2021/4/12 15:42:40  对本文有异议

一 . 刷题小技巧 

1,c++中的for(auto a:b)用法

for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。

for(auto &a:b)中加了引用符号,可以对容器中的内容进行赋值,即可通过对a赋值来做到容器b的内容填充。

2,c++中map的元素进行按照值排序(默认按照键排序) 

 为什么不能对map进行按值排序呢?因为sort排序只能对线性结构进行排序,而map是采用红黑树的数据结构。

 一是通过将map转换到序列容器,再用STL提供的sort方法得以实现的。

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. tyedef pair<string, int> Pair;
  6.  
  7. //第3参数为函数名
  8.  
  9. bool my_compare(const Pair &p1, const Pair &p2){
  10.  
  11. return p1.second < p2.second;
  12.  
  13. }
  14.  
  15. //第3参数为重载了operator()操作符的类对象
  16.  
  17. struct MyCompare{
  18.  
  19. public:
  20.  
  21. bool operator()(const Pair &p1, const Pair &p2) const{
  22.  
  23. return p1.second < p2.second;
  24.  
  25. }
  26.  
  27. };
  28.  
  29. int main(){
  30.  
  31. map<string, int> test;
  32.  
  33. test["Alice"] = 3;
  34.  
  35. test["Cindy"] = 5;
  36.  
  37. test["Bob"] = 7;
  38.  
  39. cout << "> sort by key" << endl;
  40.  
  41. for(auto itr = test.begin(); itr != test.end(); ++itr){
  42.  
  43. cout << itr->first << ": " << itr->second << endl;
  44.  
  45. }
  46.  
  47. cout << endl;
  48.  
  49. vector<Pair> vec;
  50.  
  51. for(auto itr = test.begin(); itr != test.end(); ++itr){
  52.  
  53. vec.push_back(make_pair(itr->first, itr->second));
  54.  
  55. }
  56.  
  57. sort(vec.begin(), vec.end(), MyCompare()); //my_compare或者MyCompare()都可以
  58.  
  59. cout << "> sort by value" << endl;
  60.  
  61. for(auto itr = vec.begin(); itr != vec.end(); ++itr){
  62.  
  63. cout << itr->first << ": " << itr->second << endl;
  64.  
  65. }
  66.  
  67. return 0;
  68.  
  69. }

 

 二是通过将map的key和value位置替换

 

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef pair<string, int> Pair;
  6.  
  7. int main(){
  8.  
  9. map<string, int> test;
  10.  
  11. test["Alice"] = 3;
  12.  
  13. test["Cindy"] = 5;
  14.  
  15. test["Bob"] = 7;
  16.  
  17. cout << "> sort by key" << endl;
  18.  
  19. for(auto itr = test.begin(); itr != test.end(); ++itr){
  20.  
  21. cout << itr->first << ": " << itr->second << endl;
  22.  
  23. }
  24.  
  25. cout << endl;
  26.  
  27. map<int, string> result;
  28.  
  29. transform(test.begin(), test.end(), inserter(result, result.begin()), [](pair<string, int> a) { return pair<int, string>(a.second, a.first); });
  30.  
  31. cout << "> sort by value" << endl;
  32.  
  33. for(auto itr = result.begin(); itr != result.end(); ++itr){
  34.  
  35. cout << itr->first << ": " << itr->second << endl;
  36.  
  37. }
  38.  
  39. return 0;
  40.  
  41. }

 

3.pair的认识 

1,pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。

2,

  1. template pair make_pair(T1 a, T2 b) { return pair(a, b); }

很明显,我们可以使用pair的构造函数也可以使用make_pair来生成我们需要的pair。 一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象很方便,代码也很清晰。 另一个使用的方面就是pair可以接受隐式的类型转换,这样可以获得更高的灵活度。

3,对于pair类,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员。

4,质数判断的方法 

1,常见方法,直接通过遍历到n的开平法进行整除判断,效率不高。

2,通过标志方法,设置一个bool数组,先进行初始化,奇数设置为true,偶数设置为false,只需将前面为true表示为质数的倍数设置为flase即可,效率较上面高。

3,质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;

  

  1. bool isPrime( int num )
  2.  
  3. {
  4.  
  5. //两个较小数另外处理
  6.  
  7. if(num == 2||num == 3 )
  8.  
  9. return 1;
  10.  
  11. //不在6的倍数两侧的一定不是质数
  12.  
  13. if(num % 6 != 1&&num % 6 != 5)
  14.  
  15. return 0;
  16.  
  17. int tmp = sqrt(num);
  18.  
  19. //在6的倍数两侧的也可能不是质数
  20.  
  21. for(int i = 5;i <= tmp;i += 6)
  22.  
  23. if(num %i == 0||num % (i+ 2) == 0)
  24.  
  25. return 0;
  26.  
  27. //排除所有,剩余的是质数
  28.  
  29. return 1;
  30.  
  31. }

 

二 . 错题记录

(1),堆栈

1,1021. 删除最外层的括号:

方法一:双标记法:只要考虑()配对,用一个标记就行

  1. class Solution {
  2.  
  3. public:
  4.  
  5. string removeOuterParentheses(string S) {
  6.  
  7. string res = "";
  8.  
  9. int a[S.length()+1];
  10.  
  11. int flag=0;
  12.  
  13. for(int i=0;i<S.length();i++)
  14.  
  15. {
  16.  
  17. if(S[i]=='(')
  18.  
  19. {
  20.  
  21. flag++;
  22.  
  23. a[i]=flag;
  24.  
  25. }
  26.  
  27. else{
  28.  
  29. flag--;
  30.  
  31. a[i]=flag;
  32.  
  33. }
  34.  
  35. }
  36.  
  37. for(int i=0;i<S.length();i++)
  38.  
  39. {
  40.  
  41. if(S[i]=='('&&a[i]==1)
  42.  
  43. {
  44.  
  45. }
  46.  
  47. else if(S[i]==')'&&a[i]==0)
  48.  
  49. {
  50.  
  51.  
  52. }
  53.  
  54. else res.push_back(S[i]);
  55.  
  56. }
  57.  
  58. return res;
  59.  
  60. }
  61.  
  62. };

方法二:栈:只要考虑到'(',')'是否为最外面的符号就行

  1. class Solution {
  2.  
  3. public:
  4.  
  5. string removeOuterParentheses(string S) {
  6.  
  7. string res = "";
  8.  
  9. stack<char> a;
  10.  
  11. for(auto b:S)
  12.  
  13. {
  14.  
  15. if(b=='(')
  16.  
  17. {
  18.  
  19. if(!a.empty())
  20.  
  21. res.push_back('(');// 表示非外部
  22.  
  23. a.push('(');
  24.  
  25. }
  26.  
  27. else{
  28.  
  29. if(a.size()!=1){// 表示非外部
  30.  
  31. res.push_back(')');
  32.  
  33. }
  34.  
  35. a.pop();
  36.  
  37. }
  38.  
  39. }
  40.  
  41. return res;
  42.  
  43. }
  44.  
  45. };

 2,347. 前 K 个高频元素

1,我的解法:用map键值对的形式记录数字出现的次数,在转换成vector进行sort的自定义排序,最后取出前k个元素。提示:尽量可以用hask_map的时候就不用map.

  1. typedef pair<int,int> Pair;
  2.  
  3.  
  4. bool my_compare(const Pair &p1, const Pair &p2){
  5.  
  6. return p1.second > p2.second;
  7.  
  8. }
  9.  
  10. class Solution {
  11.  
  12. public:
  13.  
  14. vector<int> topKFrequent(vector<int>& nums, int k) {
  15.  
  16. map<int,int>mymap;
  17.  
  18. vector<Pair> v;
  19.  
  20. vector<int> res;
  21.  
  22. for(auto i:nums)
  23.  
  24. {
  25.  
  26. mymap[i]+=1;
  27.  
  28. }
  29.  
  30. for(auto itr = mymap.begin(); itr != mymap.end(); ++itr)
  31.  
  32. v.push_back(make_pair(itr->first, itr->second));
  33.  
  34.  
  35. sort(v.begin(),v.end(),my_compare);
  36.  
  37. for(int i=0;i<k;i++)
  38.  
  39. {
  40.  
  41. res.push_back(v[i].first);
  42.  
  43. }
  44.  
  45. return res;
  46.  
  47. }
  48.  
  49. };

2,官方答案:有些写法看不懂

  1. class Solution {
  2.  
  3. public:
  4.  
  5. static bool cmp(pair<int, int>& m, pair<int, int>& n) {
  6.  
  7. return m.second > n.second;
  8.  
  9. }
  10.  
  11. vector<int> topKFrequent(vector<int>& nums, int k) {
  12.  
  13. unordered_map<int, int> occurrences;
  14.  
  15. for (auto& v : nums) {
  16.  
  17. occurrences[v]++;
  18.  
  19. }
  20.  
  21. // pair 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
  22.  
  23. priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);
  24.  
  25. for (auto& [num, count] : occurrences) {
  26.  
  27. if (q.size() == k) {
  28.  
  29. if (q.top().second < count) {
  30.  
  31. q.pop();
  32.  
  33. q.emplace(num, count);
  34.  
  35. }
  36.  
  37. } else {
  38.  
  39. q.emplace(num, count);
  40.  
  41. }
  42.  
  43. }
  44.  
  45. vector<int> ret;
  46.  
  47. while (!q.empty()) {
  48.  
  49. ret.emplace_back(q.top().first);
  50.  
  51. q.pop();
  52.  
  53. }
  54.  
  55. return ret;
  56.  
  57. }
  58.  
  59. };

 3,丑数

题目描述:给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。丑数 就是只包含质因数 2、3 和/或 5 的正整数。

分类讨论的情况

  1. class Solution {
  2.  
  3. public:
  4.  
  5. bool isUgly(int n) {
  6.  
  7. if (n <= 0) return false;
  8.  
  9. while (n % 2 == 0) n /= 2;
  10.  
  11. while (n % 3 == 0) n /= 3;
  12.  
  13. while (n % 5 == 0) n /= 5;
  14.  
  15. return n == 1;
  16.  
  17. }
  18.  
  19. };
  20.  

总结

通过c++制作插件以后,我们就可以快速刷题和拥有错题记录本。内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!以上就是如何用C++制作LeetCode刷题小技巧-错题记录本的详细内容,更多关于LeetCode刷题小技巧-错题记录本的资料请关注w3xue其它相关文章!,希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号