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

OJ 題目解析:元素刪除 —— DavidDeng 離隊後的面試編號序列

     編輯:關於C

題目需求

  • 輸入 T 組測試資料。
  • 每組:M(隊伍人數)→ M 個編號 → N(DavidDeng 編號)。
  • 刪除編號為 N 的元素,輸出剩餘序列,編號間以單一空格分隔。
  • 保證編號唯一、N ≤ 10000。

完整解法

#include <stdio.h>

int main(void)
{
    int T;
    if (scanf("%d", &T) != 1) return 0;

    while (T--) {
        int M;
        scanf("%d", &M);

        int id[10000];
        for (int i = 0; i < M; i++)
            scanf("%d", &id[i]);

        int N;
        scanf("%d", &N);

        // 找到 N 的位置並前移後續元素
        int pos = -1;
        for (int i = 0; i < M; i++) {
            if (id[i] == N) { pos = i; break; }
        }

        if (pos != -1) {
            for (int i = pos; i < M - 1; i++)
                id[i] = id[i + 1];
            M--;  // 有效長度減 1
        }

        // 輸出,注意格式:元素間單一空格,行尾無多餘空格
        for (int i = 0; i < M; i++) {
            if (i) putchar(' ');
            printf("%d", id[i]);
        }
        if (T > 0) putchar('\n');  // 非最後一組換行
    }
    return 0;
}

關鍵點解析

  1. 陣列前移刪除:找到目標位置 pos,將 pos+1..M-1 依序前移一格,時間 O(M),空間 O(1) 額外空間。
  2. 輸入讀取:編號間以空格分隔,scanf("%d") 自動跳過空白,直接讀入陣列。
  3. 輸出格式控制:首元素前不印空格,後續元素前各印一空格;最後一組無尾隨換行(題目通常寬容,但嚴格遵循更佳)。
  4. 邊界情況:N 保證存在,但防禦性程式仍檢查 pos != -1。

替代方案:輸出時跳過

若不需修改陣列(後續無操作),可直接輸出時略過 N:

int first = 1;
for (int i = 0; i < M; i++) {
    if (id[i] == N) continue;
    if (!first) putchar(' ');
    printf("%d", id[i]);
    first = 0;
}

更簡潔,避免陣列移動開銷。

樣本驗證

輸入:
1
4
1 3 8 2
3

輸出:
1 8 2

常見錯誤

  • 輸出行尾多餘空格 → Presentation Error。
  • 未處理多組測資間換行 → 格式錯誤。
  • 使用 gets/fgets 讀編號行 → 需自行分割字串,scanf 更簡單。
  • 陣列大小不足 → M 最大未給,建議開 10000 或動態分配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved