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

C語言陣列操作:判斷兩個陣列是否有相同元素

     編輯:關於C語言

C語言陣列操作:判斷兩個陣列是否有相同元素

給定兩個整數陣列,判斷是否存在至少一個相同元素。這是雙重迴圈搜尋的經典應用,也是理解時間複雜度 O(n×m) 的入門案例。

基礎實作(原始碼修正版)

#include <stdio.h>
#include <stdbool.h>  // C99 布林型別

bool arrays_have_common(const int *arr1, size_t len1, 
                        const int *arr2, size_t len2) {
    for (size_t i = 0; i < len1; i++) {
        for (size_t j = 0; j < len2; j++) {
            if (arr1[i] == arr2[j]) {
                return true;  // 找到即返回
            }
        }
    }
    return false;
}

int main() {
    int arr1[] = {1, 2, 3, 4, 5};
    int arr2[] = {1, 2, 7, 4, 9};
    
    size_t len1 = sizeof(arr1) / sizeof(arr1[0]);
    size_t len2 = sizeof(arr2) / sizeof(arr2[0]);
    
    if (arrays_have_common(arr1, len1, arr2, len2)) {
        puts("存在相同元素");
    } else {
        puts("無相同元素");
    }
    return 0;
}

原始碼的關鍵 Bug 修正

// 原始碼錯誤:
for (i = 0; i < sizeof(arr1)/sizeof(arr1[0]); i++) {
    for (j = 0; j < sizeof(arr2)/sizeof(arr2[0]); j++) {
        if (arr1[i] == arr2[j]) {
            printf("存在相同元素");
            break;  // 只跳出內層迴圈
        }
    }
    break;  // 錯誤:外層迴圈也 break,導致只檢查 arr1[0]!
}

修正:移除外層 break,或使用函數提前 return,或設置標誌變量。

進階優化策略

排序 + 雙指針實作

int cmp_int(const void *a, const void *b) {
    return *(const int*)a - *(const int*)b;
}

bool arrays_have_common_sorted(int *arr1, size_t len1, 
                               int *arr2, size_t len2) {
    qsort(arr1, len1, sizeof(int), cmp_int);
    qsort(arr2, len2, sizeof(int), cmp_int);
    
    size_t i = 0, j = 0;
    while (i < len1 && j < len2) {
        if (arr1[i] == arr2[j]) return true;
        else if (arr1[i] < arr2[j]) i++;
        else j++;
    }
    return false;
}

位圖法(數值範圍 0-1000 時極快)

bool arrays_have_common_bitmap(const int *arr1, size_t len1,
                               const int *arr2, size_t len2) {
    unsigned long bitmap[32] = {0};  // 覆蓋 0-1023
    for (size_t i = 0; i < len1; i++) {
        if (arr1[i] >= 0 && arr1[i] < 1024)
            bitmap[arr1[i] >> 6] |= 1UL << (arr1[i] & 63);
    }
    for (size_t j = 0; j < len2; j++) {
        if (arr2[j] >= 0 && arr2[j] < 1024)
            if (bitmap[arr2[j] >> 6] & (1UL << (arr2[j] & 63)))
                return true;
    }
    return false;
}

總結

基礎雙重迴圈適合教學與小規模資料;實務開發中,根據資料量、是否可修改、數值範圍選擇排序雙指針或哈希/位圖法。**修正原始碼的外層 break 錯誤是關鍵**,否則邏輯完全失效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法時間複雜度空間複雜度適用場景
雙重迴圈O(n×m)O(1)小陣列、無序、不可修改
排序 + 雙指針O(n log n + m log m)O(1) 或 O(n+m)中大型陣列、可修改
哈希表/位圖O(n+m)O(n)大陣列、頻繁查詢、數值範圍小