首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

POJ 1002 487-3279:電話號碼映射與重複計數

     編輯:C++ 入門

題目大意

輸入 n 個電話號碼(含字母、數字、連字符),按鍵盤映射(ABC→2, DEF→3...)轉為標準 7 位數字格式 XXX-XXXX,統計出現≥2次的號碼並按字典序輸出號碼與計數。無重複輸出 "No duplicates."。

映射表


int map[26] = {
    2,2,2, 3,3,3, 4,4,4, 5,5,5, 6,6,6, 7,7,7,7, 8,8,8, 9,9,9
    // A B C  D E F  G H I  J K L  M N O  P Q R S  T U V  W X Y  (Q/Z 無映射)
};

處理流程

  1. 讀入每行,提取數字/字母,按映射轉換,插入 - 形成標準格式。
  2. 存入 `vector`,排序。
  3. 掃描排序後數組,計數連續相同串,計數≥2 時輸出。

關鍵代碼


int main() {
    int n; scanf("%d", &n); getchar();
    vector nums;
    char line[100], std[10];
    for (int t=0; t= '0' && *p <= '9') std[idx++] = *p;
            else if (*p >= 'A' && *p <= 'Y' && *p != 'Q')
                std[idx++] = map[*p - 'A'] + '0';
            if (idx == 3) std[idx++] = '-';
        }
        std[idx] = '\0';
        nums.push_back(std);
    }
    sort(nums.begin(), nums.end());
    bool found = false;
    for (int i=0, cnt=1; i= 2) { printf("%s %d\n", nums[i].c_str(), cnt); found = true; }
            cnt = 1;
        }
    }
    if (!found) printf("No duplicates.\n");
    return 0;
}

性能提示

  • C++ `iostream` 同步關閉(`ios::sync_with_stdio(false)`)或用 C `scanf/printf` 可顯著加速(題目原文提到 G++ TLE,C++ 500ms 過)。
  • 字符串複製用 `string::copy` 或直接 `c_str()` 輸出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved