编程题单身狗怎么做的

时间:2025-01-28 03:55:51 网络游戏

方法一:使用哈希表

这种方法通过使用哈希表来记录每个客人的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;

}

```

总结

以上方法各有优缺点,选择哪种方法取决于具体问题的要求和约束