问题描述:
某公司年会设置了抽奖箱,已知该奖箱中特等奖一名,其余新人奖、口碑奖、创新奖等鼓励奖项
都有两名(如果有该奖项),请设计算法来快速找到那个只出现了一次的特等奖。
示例输入:
[1, 2, 3, 2, 3]
示例输出:
1
示例输入2:
[3, 2, 2]
示例输出:
3
Java代码实现:
public static void main(String[] args) {
int[] nums = { 1, 2, 3, 2, 3 };
int[] nums2 = { 3, 2, 2 };
int[] nums3 = { 1, 2, 2, 3, 3, 4, 5, 6, 5, 4, 6 };
System.out.println("计数器实现:");
System.out.print(uniqueAward1(nums) + "\t");
System.out.print(uniqueAward1(nums2) + "\t");
System.out.println(uniqueAward1(nums3));
System.out.println("非计数器实现:");
System.out.print(uniqueAward2(nums) + "\t");
System.out.print(uniqueAward2(nums2) + "\t");
System.out.println(uniqueAward2(nums3));
System.out.println("异或操作实现:");
System.out.print(uniqueAward3(nums) + "\t");
System.out.print(uniqueAward3(nums2) + "\t");
System.out.println(uniqueAward3(nums3));
}
public static int uniqueAward1(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int count = 1;
for (int j = 0; j < nums.length; j++) {
if (i == j) {
continue;
}
if (nums[i] == nums[j]) {
count++;
}
}
if (count == 1)
return nums[i];
}
return -1;
}
public static int uniqueAward2(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j <= nums.length; j++) {
if (i == j) {
continue;
}
if (j == nums.length) {
return nums[i];
}
if (nums[i] == nums[j]) {
break;
}
}
}
return -1;
}
public static int uniqueAward3(int[] nums) {
int res = 0;
for (int i : nums) {
res ^= i;
}
return res;
}
执行结果:
计数器实现:
1 3 1
非计数器实现:
1 3 1
异或操作实现:
1 3 1