1 条题解

  • 0
    @ 2026-1-29 22:14:31
    #include<bits/stdc++.h>
    using namespace std;
    // arr-存储第一个原始数组,brr-存储第二个原始数组
    // arr_u-arr去重排序后数组,brr_u-brr去重排序后数组
    // union_arr-存储并集结果,inter_arr-存储交集结果
    int arr[1100], brr[1100];
    int arr_u[1100], brr_u[1100];
    int union_arr[2200], inter_arr[1100];
    
    int main() {
        // [1] 读取两个原始数组的元素个数m、n
        int m, n;
        cin >> m >> n;
        
        // [2] 读取第一个数组的m个元素存入arr
        for (int i = 0; i < m; i++) {
            cin >> arr[i];
        }
        // [3] 读取第二个数组的n个元素存入brr
        for (int i = 0; i < n; i++) {
            cin >> brr[i];
        }
    
        // [4] 对arr排序并去重,得到去重后数组arr_u,记录其长度m_u
        sort(arr, arr + m);
        int m_u = 1; // 初始化去重后长度为1(至少包含第一个元素)
        arr_u[0] = arr[0]; // 第一个元素直接存入去重数组
        for (int i = 1; i < m; i++) {
            if (arr[i] != arr[i-1]) { // 当前元素与前一个不同,为新元素
                arr_u[m_u] = arr[i];
                m_u++; // 去重数组长度+1
            }
        }
    
        // [5] 对brr排序并去重,得到去重后数组brr_u,记录其长度n_u
        sort(brr, brr + n);
        int n_u = 1; // 初始化去重后长度为1
        brr_u[0] = brr[0]; // 第一个元素直接存入去重数组
        for (int i = 1; i < n; i++) {
            if (brr[i] != brr[i-1]) { // 当前元素与前一个不同,为新元素
                brr_u[n_u] = brr[i];
                n_u++; // 去重数组长度+1
            }
        }
    
        // [6] 双指针遍历两个去重排序数组,求并集(自动有序、无重复)
        int i = 0, j = 0, u_len = 0; // i/j-数组指针,u_len-并集数组长度
        while (i < m_u && j < n_u) {
            if (arr_u[i] < brr_u[j]) { // 左数组元素更小,加入并集
                union_arr[u_len++] = arr_u[i++];
            } else if (arr_u[i] > brr_u[j]) { // 右数组元素更小,加入并集
                union_arr[u_len++] = brr_u[j++];
            } else { // 两元素相等,仅加入一次(避免重复)
                union_arr[u_len++] = arr_u[i++];
                j++;
            }
        }
        // 处理左数组剩余元素,加入并集
        while (i < m_u) union_arr[u_len++] = arr_u[i++];
        // 处理右数组剩余元素,加入并集
        while (j < n_u) union_arr[u_len++] = brr_u[j++];
    
        // [7] 双指针遍历两个去重排序数组,求交集(自动有序、无重复)
        i = 0, j = 0; // 重置指针
        int i_len = 0; // i_len-交集数组长度
        while (i < m_u && j < n_u) {
            if (arr_u[i] < brr_u[j]) { // 左数组元素更小,指针后移
                i++;
            } else if (arr_u[i] > brr_u[j]) { // 右数组元素更小,指针后移
                j++;
            } else { // 两元素相等,为交集元素,加入交集数组
                inter_arr[i_len++] = arr_u[i++];
                j++;
            }
        }
    
        // [8] 输出并集结果,元素间用空格分隔
        for (int k = 0; k < u_len; k++) {
            cout << union_arr[k] << " ";
        }
        cout << endl; // 换行分隔并集和交集
    
        // [9] 输出交集结果,元素间用空格分隔
        for (int k = 0; k < i_len; k++) {
            cout << inter_arr[k] << " ";
        }
        cout << endl;
    
        return 0;
    }
    
    • 1

    信息

    ID
    1170
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    3
    已通过
    1
    上传者