问题描述
小M正在开发一个多任务下载器,可以同时下载多个文件。每个文件都有一个唯一的下载速度(整数),但系统显示时不小心将每个速度值都重复显示了两次(即除了一个独特的速度值外,其他每个速度值都恰好出现两次)。小M需要快速找出这个独特下载速度的文件,以便优先处理它。
要求:
- 设计一个算法,在 O(n) 时间内找出独特的下载速度,其中 n 是速度列表的长度。
- 尽量减少额外空间的使用,以优化下载器的性能。
测试样例
样例1:
输入:
speeds = [5, 3, 5, 2, 3, 4, 4]输出:2解释:速度 2 只出现一次,是独特的下载速度,其他速度(5、3、4)都恰好出现两次。
样例2:
输入:
speeds = [10, 20, 10, 30, 20, 40, 40]输出:30解释:速度 30 只出现一次,是独特的下载速度,其他速度(10、20、40)都恰好出现两次。
样例3:
输入:
speeds = [1, 1, 2, 2, 3, 3, 4]输出:4解释:速度 4 只出现一次,是独特的下载速度,其他速度(1、2、3)都恰好出现两次。
样例4:
输入:
speeds = [5]输出:5解释:列表只有一个速度值,因此 5 就是独特的下载速度。
约束条件
- 1 ≤ speeds.length ≤ 1001
- 0 ≤ speeds[i] ≤ 1000
- 列表长度为奇数
- 除了一个下载速度只出现一次外,其余每个下载速度都恰好出现两次
程序代码
#include <stdio.h>
int findUniqueSpeed(int* speeds, int speedsSize) {
int result = 0;
for (int i = 0; i < speedsSize; i++) {
result ^= speeds[i];
}
return result;
}
int main() {
int speeds1[] = {5, 3, 5, 2, 3, 4, 4};
int speeds2[] = {10, 20, 10, 30, 20, 40, 40};
int speeds3[] = {1, 1, 2, 2, 3, 3, 4};
int speeds4[] = {5};
printf("%d\n", findUniqueSpeed(speeds1, 7)); // 2
printf("%d\n", findUniqueSpeed(speeds2, 7)); // 30
printf("%d\n", findUniqueSpeed(speeds3, 7)); // 4
printf("%d\n", findUniqueSpeed(speeds4, 1)); // 5
return 0;
}
#include <stdio.h> int findUniqueSpeed(int* speeds, int speedsSize) { int result = 0; for (int i = 0; i < speedsSize; i++) { result ^= speeds[i]; } return result; } int main() { int speeds1[] = {5, 3, 5, 2, 3, 4, 4}; int speeds2[] = {10, 20, 10, 30, 20, 40, 40}; int speeds3[] = {1, 1, 2, 2, 3, 3, 4}; int speeds4[] = {5}; printf("%d\n", findUniqueSpeed(speeds1, 7)); // 2 printf("%d\n", findUniqueSpeed(speeds2, 7)); // 30 printf("%d\n", findUniqueSpeed(speeds3, 7)); // 4 printf("%d\n", findUniqueSpeed(speeds4, 1)); // 5 return 0; }