问题描述
小明和小红是两位热爱学习的同学,他们决定利用暑假时间学习新技能。他们列出了 n 个技能,每个技能有一个学习时间(单位:小时)。有趣的是,除了一个技能外,所有技能的学习时间都恰好出现了两次,这意味着有两个技能需要相同的时间完成。只有一个技能的学习时间是独一无二的。
现在,他们需要找出那个独特学习时间的技能,以便合理规划学习计划。请你设计一个算法,帮助他们在 O(n) 时间内找到这个独特学习时间的技能,同时尽量减少额外空间的使用。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是技能的数量。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例1:
输入:
times = [5, 10, 5, 10, 15, 20, 20]输出:15解释:学习时间 15 小时的技能是唯一没有配对的。
样例2:
输入:
times = [0, 2, 0, 2, 1]输出:1解释:学习时间 1 小时的技能只出现一次,是独特的。
样例3:
输入:
times = [3, 8, 3, 8, 12]输出:12解释:12 是技能列表中唯一一个不重复的学习时间。
约束条件
- 1 ≤ times.length ≤ 1001
- 0 ≤ timesi ≤ 1000
- 技能数量为奇数
- 除了一个技能的学习时间只出现一次外,其余每个学习时间都恰好出现两次
程序代码
#include <stdio.h>
int findUniqueTime(int* times, int timesSize) {
int result = 0;
for (int i = 0; i < timesSize; i++) {
result ^= timesi;
}
return result;
}
int main() {
int times1\[\] = {5, 10, 5, 10, 15, 20, 20};
int times2\[\] = {0, 2, 0, 2, 1};
int times3\[\] = {3, 8, 3, 8, 12};
printf("%d\n", findUniqueTime(times1, 7)); // 15
printf("%d\n", findUniqueTime(times2, 5)); // 1
printf("%d\n", findUniqueTime(times3, 5)); // 12
return 0;
}
cpp
#include <stdio.h>
int findUniqueTime(int* times, int timesSize) {
int result = 0;
for (int i = 0; i < timesSize; i++) {
result ^= times[i];
}
return result;
}
int main() {
int times1[] = {5, 10, 5, 10, 15, 20, 20};
int times2[] = {0, 2, 0, 2, 1};
int times3[] = {3, 8, 3, 8, 12};
printf("%d\n", findUniqueTime(times1, 7)); // 15
printf("%d\n", findUniqueTime(times2, 5)); // 1
printf("%d\n", findUniqueTime(times3, 5)); // 12
return 0;
}
运行结果
