方法一:使用哈希表
这种方法通过使用哈希表来记录每个客人的ID及其对应的情侣ID。遍历所有客人ID,如果某个ID在哈希表中存在,则将其标记为“已签到”,否则标记为“落单”。最后,输出所有标记为“落单”的客人ID。
```c
include include include define MAX_GUESTS 10000 int main() { int n, m; scanf("%d %d", &n, &m); int couple[MAX_GUESTS]; int isExist[MAX_GUESTS] = {0}; int guest[MAX_GUESTS]; for (int i = 0; i < n; i++) { int id1, id2; scanf("%d %d", &id1, &id2); couple[id1] = id2; couple[id2] = id1; } for (int i = 0; i < m; i++) { int id; scanf("%d", &id); if (couple[id] != -1) { isExist[couple[id]] = 1; } else { guest[i] = id; } } int singleCount = 0; for (int i = 0; i < m; i++) { if (!isExist[guest[i]]) { printf("%d ", guest[i]); singleCount++; } } printf("\n%d\n", singleCount); return 0; } ``` 方法二:使用异或运算 这种方法利用异或运算的性质,即相同的数字异或结果为0,不同的数字异或结果为1。通过遍历数组,将所有数字进行异或运算,最终剩下的数字即为单身狗的数字。 ```c include int find_single_dog1(int arr[], int sz) { int ret = 0; for (int i = 0; i < sz; i++) { ret ^= arr[i]; } return ret; } int main() { int arr[] = {1, 2, 3, 4, 5, 1, 2, 3, 4}; int sz = sizeof(arr) / sizeof(arr); int ret = find_single_dog1(arr, sz); printf("%d\n", ret); return 0; } ``` 方法三:使用排序和遍历 这种方法首先对数组进行排序,然后遍历排序后的数组,检查每个元素是否与其相邻元素相同。如果不同,则该元素为单身狗。 ```c include include void bubbleSort(int *arr, int n) { int end = n; while (end > 0) { int flag = 0; for (int i = 1; i < end; i++) { if (arr[i] == arr[i - 1]) { flag = 1; } if (flag) { int temp = arr[i]; arr[i] = arr[i - 1]; arr[i - 1] = temp; } } end--; } } int main() { int arr[] = {1, 2, 3, 4, 5, 1, 2, 3, 4}; int sz = sizeof(arr) / sizeof(arr); bubbleSort(arr, sz); int singleCount = 0; for (int i = 0; i < sz; i++) { if (i > 0 && arr[i] == arr[i - 1]) { continue; } printf("%d ", arr[i]); singleCount++; } printf("\n%d\n", singleCount); return 0; } ``` 总结 以上方法各有优缺点,选择哪种方法取决于具体问题的要求和约束