问题描述
小A在玩一个有趣的游戏,他站在数轴的原点(位置0)上,手里有一串移动指令。每个指令是一个整数,表示小A需要向左(负数)或向右(正数)移动的步数。但是小A发现,当他按顺序执行所有指令后,竟然神奇地回到了原点!原来,除了一个指令只出现了一次外,其他所有指令都恰好出现了两次(即每个指令在数组中出现两次)。现在需要你帮助小A找出那个只出现了一次的指令。
要求:
- 设计一个算法,在O(n)时间内找出只出现一次的指令。
- 尽量减少额外空间的使用,以体现算法优化能力。
测试样例
样例1:
输入:
moves = [1, -1, 2, -2, 3, -3, 4, -4, 5]输出:5解释:指令5只出现一次,其他指令都成对出现(各出现两次)。执行所有指令后的净位移为:1 + (-1) + 2 + (-2) + 3 + (-3) + 4 + (-4) + 5 = 0 + 5 = 5,正好等于只出现一次的指令5的值。
样例2:
输入:
moves = [0, 1, 0, 1, -2]输出:-2解释:指令-2只出现一次,其他指令都成对出现(各出现两次)。执行所有指令后的净位移为:0 + 1 + 0 + 1 + (-2) = 0 + (-2) = -2,正好等于只出现一次的指令-2的值。
样例3:
输入:
moves = [3, -3, 7, -7, 10]输出:10解释:指令10只出现一次,其他指令都成对出现(各出现两次)。执行所有指令后的净位移为:3 + (-3) + 7 + (-7) + 10 = 0 + 10 = 10,正好等于只出现一次的指令10的值。
约束条件
- 1 ≤ moves.length ≤ 1001
- -1000 ≤ movesi ≤ 1000
- 指令序列长度为奇数
- 除了一个指令只出现一次外,其余每个指令都恰好出现两次
- 初始位置为0,执行所有指令后位置等于只出现一次的那个指令的值
程序代码
#include <stdio.h>
int findUniqueMove(int* moves, int movesSize) {
int result = 0;
for (int i = 0; i < movesSize; i++) {
result ^= movesi;
}
return result;
}
int main() {
// 样例1:使用修正后的数据
int moves1\[\] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
int moves2\[\] = {0, 1, 0, 1, -2};
int moves3\[\] = {3, -3, 7, -7, 10};
printf("%d\n", findUniqueMove(moves1, 9)); // 5
printf("%d\n", findUniqueMove(moves2, 5)); // -2
printf("%d\n", findUniqueMove(moves3, 5)); // 10
return 0;
}
cpp
#include <stdio.h>
int findUniqueMove(int* moves, int movesSize) {
int result = 0;
for (int i = 0; i < movesSize; i++) {
result ^= moves[i];
}
return result;
}
int main() {
// 样例1:使用修正后的数据
int moves1[] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
int moves2[] = {0, 1, 0, 1, -2};
int moves3[] = {3, -3, 7, -7, 10};
printf("%d\n", findUniqueMove(moves1, 9)); // 5
printf("%d\n", findUniqueMove(moves2, 5)); // -2
printf("%d\n", findUniqueMove(moves3, 5)); // 10
return 0;
}
运行结果
