唯一的特等奖

问题描述:
某公司年会设置了抽奖箱,已知该奖箱中特等奖一名,其余新人奖、口碑奖、创新奖等鼓励奖项
都有两名(如果有该奖项),请设计算法来快速找到那个只出现了一次的特等奖。
示例输入:
[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++; // 如果下标不同,但是值相同,则计数器+1
				}
			}

			// 判断计数器是否唯一,如果唯一则证明找到了数组中的唯一出现一次的元素
			if (count == 1)
				return nums[i];
		}
		return -1; // 查找失败, 返回-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) {
					// 判断j的值,防止数组越界错误
					return nums[i];
				}
				if (nums[i] == nums[j]) {
					break; // 如果有重复的数字直接跳出循环
				}
			}
		}
		return -1; // 查找失败,返回-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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bu Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值