前言:
一般我在刷leetcode题的时候既不喜欢在Playground也不喜欢在本地编译器里面打代码,而是直接在题目后的窗口里写代码。
于是对于我这种氪不起金的玩家来说,经常就会出现奇怪的bug,找了半天也找不到。
这里就对以前遇到过的问题进行总结。
案例1:
我找了老半天问题在哪里。发现不管在for循环后面加什么语句都会出错。 最后放到visual studio里面才发现了错误。。。
错误原因:c++注释行尾的反斜杠会将下一行也注释掉(即连接本行与下一行)!
解决办法:避免注释行末尾出现\(除非故意的)
总结:不得不承认有时不屑一顾的小基础能够在偶然的时候把自己死死卡住。但是这个问题如果在我的本地编译器里面写代码的话是很容易看出来的(因为字体变绿了)。
不过在leetcode这里面却没有任何显示!
。。。。。。
案例2:
错误代码是:
Line 1584: rapidjson::SizeType rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>::Size() const [Encoding = rapidjson::UTF8<char>, Allocator = rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>]: Assertion `IsArray()' failed. (document.h)
错误原因:测试用例里面输入的不对!!!(因为当前的测试用例是我自己输入进去的)
解决办法:执行测试用例
、
总结:
所以说输入测试用例的时候要小心点。。。。
这种错误位置行数很大的错误一般不是简单的语法错误之类的,这时候思维就要扩展一下,想想别的地方有没有问题。
我找这个错误的原因找得都快把错误码背下来了。。。
案例3:
代码:
class UnionFind{ private: vector<int> height; vector<int> parent; vector<int> count; int N; public: UnionFind(int n){ for(int i =0;i<n;++i){ parent.push_back(i); height.push_back(1); } count.resize(n,1); N = n; } int Find(int a){//路径合并
int pa = parent[a]; if(pa==a) return pa; while(pa!=parent[pa]){ pa = parent[pa]; } if(pa!=parent[a]) parent[a]=pa; return pa; } int Union(int a,int b){ //这里有返回值是对并查集模板的修改以适应要求
int pa = Find(a); int pb = Find(b); if(pa!=pb){ if(height[pa]>height[pb]){ //按秩合并
parent[pb]=pa; count[pa]+=count[pb]; }else if(height[pa]<height[pb]){ parent[pa]=pb; count[pb]+=count[pa]; }else{ parent[pa]=pb; height[pb]++; count[pb]+=count[pa]; } return 1; } return 0; } }; struct Edge{ int from,to,weight; Edge(int form,int to ,int weight):from(from),to(to),weight(weight){} }; class Solution { public: int minCostConnectPoints(vector<vector<int>>& points) { vector<Edge> edges; int N = points.size(); UnionFind uf(points.size()); for(int i =0;i<points.size();++i){ for(int j =i+1;j<points.size();++j){ int dist = abs(points[i][0]-points[j][0])+abs(points[i][1]-points[j][1]); edges.emplace_back(dist,i,j); edges.emplace_back(dist,j,i); } } sort(edges.begin(),edges.end(),[&](Edge a,Edge b){ return a.weight<b.weight; }); int len=0,n=1; for(auto& e:edges){ if(uf.Union(e.from,e.to)){ len += e.weight; n++; if(n==N) return len; } cout<<e.weight<<endl; } return 0; } };
然后报错:
错误原因:
我在程序里面加入cout语句,发现是可以输出部分的,说明程序在编译阶段没有出问题。
然后我把代码移植到visual studio里面执行,报错说是vector的数组下标越界了,于是我仔细看了几遍程序终于找到了问题所在:
这个地方的 参数顺序放错了 应该是i,j,dist;错误的参数导致这个并查集类里面操作的时候使vector的下标越界。
(呵呵,后来改完后发现还是这个错误,我找了老半天发现我struct Edge里面的参数from写成了form···················································)
解决办法:
找到使数组越界的原因并修改代码。
案例4:
代码:
class Solution { public: vector<int> addToArrayForm(vector<int>& A, int K) { vector<int>B; do{ B.insert(B.begin(),K%10); K = K/10; }while(K); //之所以用do while是为了考虑到K==0的情况 int i =1; vector<int>res; int temp = 0; while((A.size()-i>=0)&&(B.size()-i>=0)){ temp+=A[A.size()-i]+B[B.size()-i]; res.insert(res.begin(),temp%10); temp/=10; i++; } while(A.size()>=i){ temp+=A[A.size()-i]; res.insert(res.begin(),temp%10); temp/=10; i++; } while(B.size()>=i){ temp+=B[B.size()-i]; res.insert(res.begin(),temp%10); temp/=10; i++; } if(temp) res.insert(res.begin(),temp); return res; } };
错误原因:
经过我无数次的调试终于找到了问题所在:
当B.size()=2,i=3的时候 B.size()-i是一个非常大而奇怪的数字,不是负数。
出现这种情况的原因是因为vector.size()是一个无符号整型。。。。
解决办法:
这样写即可。
总结:
学一门编程语言的时候要打实了基础!