LeetCode刷題中出現的奇怪的錯誤及解決辦法


前言:

一般我在刷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()是一個無符號整型。。。。

解決辦法:

 

 這樣寫即可。

總結:

學一門編程語言的時候要打實了基礎!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM