首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 統計字串中不同 ASCII 字元個數:修正巢狀迴圈邏輯漏洞

     編輯:程式設計疑難解答

題目要求

輸入字串,統計其中不同 ASCII 字元 (0~127) 的個數,超出範圍不計入。

原程式碼缺陷

for (int k = 0; k < i; k++) {
    p = 0;
    if (str[k] == str[i]) p = 1;
    // 缺少 break!發現重複後仍繼續比較,p 可能被後續不同字元覆蓋為 0
}

導致重複字元未被正確標記,統計結果偏大 (範例輸出 33 vs 正確 24)。

修正後核心邏輯

int countUniqueChars(const string& str) {
    bool seen[128] = {false}; // ASCII 0-127 直接寻址,O(1) 查重
    int count = 0;
    for (char c : str) {
        unsigned char uc = static_cast(c); // 避免負值索引
        if (uc <= 127 && !seen[uc]) {
            seen[uc] = true;
            count++;
        }
    }
    return count;
}

優勢分析

  • 時間複雜度:O(n) vs 原 O(n²)。
  • 空間複雜度:O(1) (固定 128 位元組)。
  • 邏輯清晰:查表法天然避免巢狀迴圈漏洞。

測試驗證

輸入 uqic^g`(s&jnl(m#vt!onwdj(ru+os&wx,輸出 24,符合預期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved