C++循環(huán)條件中unsigned int踩坑

今日做一道很常規(guī)的算法題,從數(shù)組中找出三個數(shù)和為0,用簡單的“三個指針”實現(xiàn),卻踩了一個非常愚蠢的坑。。。

bug出現(xiàn)

  • 思路:先排序,然后i、j、k有序查找
  • 報錯:非法訪問內存
  • 錯誤代碼:
/* 3 pointers */
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        
        vector<vector<int>> res;
        for (int i = 0; i < nums.size() - 2; i++) {
            if (i > 0 && nums[i] == nums[i-1]) {
                continue; // exclude duplicates
            }

            int j = i + 1, k = nums.size() - 1;
            while (j < k) {
                if (nums[i] + nums[j] + nums[k] < 0) {
                    j++;
                } else if (nums[i] + nums[j] + nums[k] > 0) {
                    k--;
                } else {
                    res.push_back(vector<int>{nums[i], nums[j], nums[k]});
                    j++;
                    while (j < k && nums[j] == nums[j-1]) {
                        j++; // exclude duplicates
                    }
                    k--;
                    while (j < k && nums[k] == nums[k+1]) {
                        k--; // exclude duplicates
                    }
                }
            }
        }
        return res;
    }
};

分析

上面代碼的bug在哪里?(題目要求無序三元組不能重復,于是做了一些去重處理,但這并不是問題的關鍵)我真的找了好久。。。

后來發(fā)現(xiàn)在輸入向量的長度為0或1時才會報這個內存有關的錯誤,于是定位到了最外層for循環(huán)的這一行:

for (int i = 0; i < nums.size() - 2; i++)

由于循環(huán)變量i是第一個數(shù)的下標,而一共有三個數(shù),我便將循環(huán)條件設為了i < nums.size() - 2,問題就出在這里:

nums.size()unsigned int類型,如果它是0或1,那么減去2之后就變成了一個很大的無符號數(shù)(正數(shù))。于是循環(huán)里面肯定就有非法內存被訪問、被使用。

解決

如果用IDE寫代碼,會報出一個int類型的iunsigned int類型的nums.size()不匹配的警告,然而我以前卻常常無視它。。。

注意如果這樣寫成下面這樣,雖然類型一致了,但是bug還在:

for (unsigned int i = 0; i < nums.size() - 2; i++)

所以解決這個問題,如果不改變代碼邏輯,就要用強制類型轉換:

for (int i = 0; i < (int)nums.size() - 2; i++)

至此,bug排除,這個故事告訴我們:

  • 不要無視warning
  • 隱式類型轉換要慎用
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,289評論 6 13
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,235評論 0 38
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別? C沒有Protection行為...
    阿面a閱讀 7,885評論 0 10
  • 2.變量和基本類型 3.字符串、向量和數(shù)組 4.表達式 5.語句 2.變量和基本類型 c++的算術類型: 一個ch...
    暮落晴空閱讀 803評論 0 0
  • 文/唐金秀 溽(ru)暑蒸人,如洪爐鑄劍,誰能躍冶(ye)?須得清泉萬派,茂樹千章,古洞含風,陰崖積雪,空...
    唐金秀閱讀 1,257評論 4 8

友情鏈接更多精彩內容