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

C++ 回文數判斷:雙指針從兩端向中間比較字符

     編輯:程式設計綜合問答

代碼片段

int i = 0, j = 0;
while ((i <= (int)strlen(str) / 2) && (j == 0)) {
    if (*(str + i) == *(str + (strlen(str) - i) - 1)) {
        i++;
    } else {
        j = 1;
    }
}
return j == 0 ? 1 : 0;

邏輯解析

  • 雙指針思想:i 從左向右(索引 0,1,2...),strlen(str) - i - 1 從右向左(索引 len-1, len-2...)。
  • 循環條件:i <= len/2 只需比較前半段;j==0 作為標誌位,一旦發現不等即置 1 退出。
  • 指針運算:
    *(str + i) 等價 str[i](左側字符)。
    *(str + (strlen(str) - i) - 1) 等價 str[len - i - 1](右側對應字符)。
    例:str="0123456789",len=10。
    i=0 比較 str[0]('0') 與 str[9]('9')。
    i=1 比較 str[1]('1') 與 str[8]('8')。以此類推。
  • 返回值:j==0 代表全程匹配(回文),返回 1;否則 0。

優化建議

// 1. 避免重複調用 strlen
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
    if (str[i] != str[len - 1 - i]) return 0;
}
return 1;

// 2. 指針版本(更符合 C 風格)
char *left = str;
char *right = str + len - 1;
while (left < right) {
    if (*left++ != *right--) return 0;
}
return 1;

複雜度

版本時間空間備註
原版O(n²)O(1)每次循環調用 strlen 導致 O(n²)
優化版O(n)O(1)預存長度/雙指針

擴展:Unicode/多字節字符

若字符串含中文(UTF-8 多字節),按字節比較會誤判。需解碼為代碼點數組(wchar_t/char32_t)或用 ICU 庫處理。

核心模式:**左右夾逼、預存長度、早退出**,是判斷回文/對稱結構的通用模板。

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