异或求缺失的数字

该博客介绍了一种在1到n之间的不重复n-1个数字中找到缺失数字的方法,通过分析避免了排序导致的时间复杂度增加。提出了三种解决方案:1) 使用加法计算总和然后减去已知数字的总和,可能存在溢出问题;2) 枚举法,创建一个临时数组标记已出现的数字,但不适合大数据量;3) 利用异或操作,所有数字与1到n异或后得到的结果即为缺失的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.ausky.work.pongo;

/**
 * 最近看到一道面试题:给定 1-n 内的不重复的 n-1个数 求出少的那个数 举例:n = 5,给4个数 1,3,4,5 那么显然 少的就是 2 分析:
 * 给定的n-1个数 并不是已经排好序的 所以 如果先进行排序 再 比较的话 那么时间复杂度 就是 n*lgn 所以先排序的办法 暂时搁置
 * 
 * @author xn-hyao-01
 * 
 */
public class FindLostNum {

	/**
	 * 方法1 :使用加法 1+2+...+n = (n+1)*n/2 缺点 n 很大的时候 n*n 就会更加大 是一个庞大的数字 有可能超出 精度
	 * 等等问题
	 * 
	 * @param array
	 * @return
	 */
	public long useAdd(int[] array, int n) {
		long sum = 1l;
		for (int tmp : array) {
			sum += tmp;
		}
		// 防止溢出 乘以 一个 long 1
		return n * (1l) * (n + 1) - sum;
	}

	/**
	 * 方法2: 使用枚举法 定义一个n位的数组 tmpArray [0,0,0...,0]; 然后取 array的数 x 然后将
	 * tmpArray[x-1] = 1; 缺点:貌似 数据量很大的时候 不可行 另外一总猜想:设置
	 * 2维数组,tmpArray[n/1000+1][1000]; 这个不知道会不会出问题 但是也感觉挺不好的 大数据量 枚举不靠谱
	 * 
	 * @param array
	 * @return
	 */
	public int useMinus(int[] array, int n) {
		int[] tmpArray = new int[n];
		for (int tmp : array) {
			tmpArray[tmp - 1] = 1;
		}
		int res = 0;
		for (int i = 0; i < n; i++) {
			if (tmpArray[i] == 0) {
				res = i + 1;
			}
		}
		return res;
	}

	/**
	 * 方法3: 提示说可以使用异或 进行解答 1.....n个数 与 1,....n,进行异或 结果为0 那么将他们进行异或 得到的结果
	 * 不就是少了的那个嘛
	 * 
	 * @param array
	 * @param n
	 * @return
	 */
	public int useXor(int[] array, int n) {
		int i = 1;
		int res = 0;
		for (int tmp : array) {
			res = res ^ i ^ tmp;
			i++;
		}
		res = res ^ i;
		return res;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值