Java程式碼取(差集,並集,交集,交集的補集)
阿新 • • 發佈:2021-11-23
原題
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; }