1. 程式人生 > 其它 >Java程式碼取(差集,並集,交集,交集的補集)

Java程式碼取(差集,並集,交集,交集的補集)

原題

https://pintia.cn/problem-sets/994805260223102976/problems/994805296180871168

程式碼

程式碼是看的別人的。https://www.cnblogs.com/siro/p/11129316.html
思路:用一個結構體陣列來存原始資料,並陣列的序號就是其首個元素的地址,方便之後取出。
一個數組來儲存正確連線順序,對這個陣列進行反轉操作。

測試點
輸入

-1 6 0
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

輸出 -1

#include <iostream>
#include <vector>
using namespace std;

struct Node
{
    int address;
    int data;
    int next;
} list[100000];

int main()
{
    int start, N, K;
    vector<int> vec;
    cin >> start >> N >> K;
    for (int i = 0; i < N; i++)
    {
        int temp;
        cin >> temp;
        cin >> list[temp].data >> list[temp].next;
        list[temp].address = temp;//陣列的序號就是其首個元素的地址,方便之後取出
    }
    //根據next值,把正確連線順序放入另一個數組
    while (start != -1)
    {
        vec.push_back(start);
        start = list[start].next;
    }
    //對vec陣列進行,每K個數據的反轉操作
    int cnt = 0;
    if (K)//K不等於0
    {
        while (cnt < N / K)
        {
            int end=cnt*K + K-1;
            for (int i = cnt*K; i < cnt*K + K/ 2; i++)//交換K個元素內的順序
            {
                int t = vec[i];
                vec[i]=vec[end-(i-cnt*K)];
                vec[end-(i-cnt*K)]=t;
            }
            cnt++;
        }
    }
    //按首尾格式輸出
    for (int j = 0; j < vec.size(); j++)
    {   
        if(j!=vec.size()-1)
        printf("%05d %d %05d\n", vec[j], list[vec[j]].data, vec[j + 1]);
        else printf("%05d %d ", vec[j], list[vec[j]].data);
    }   
    cout<<-1;
    return 0;
}

有一個測試點,沒找到。嗚嗚

其它大佬的

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int first, k, n, temp;
    cin >> first >> n >> k;
    int data[100005], next[100005], list[100005];
    for (int i = 0; i < n; i++) {
        cin >> temp;
        cin >> data[temp] >> next[temp];
    }
    int sum = 0;//不一定所有的輸入的結點都是有用的,加個計數器
    while (first != -1) {
        list[sum++] = first;
        first = next[first];
    }
    for (int i = 0; i < (sum - sum % k); i += k)
        reverse(begin(list) + i, begin(list) + i + k);
    for (int i = 0; i < sum - 1; i++)
        printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);
    printf("%05d %d -1", list[sum - 1], data[list[sum - 1]]);
    return 0;
}