①给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。②在一个长度为n的数组里的所有数字都在0到n-1的范围内,找出数组中任意一个重复的数

有点类似的两道题:
一、给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
输入:[3,0,1]
输出:2
输入:[9,6,4,2,3,5,7,0,1]
输出:8

方法一:高斯公式:1+2+3+…+n = (1+n) * n / 2

	public static int Solution(int[] arr) {
		int len = arr.length;
		int res = (len*(len+1))/2;
		for (int i = 0; i < arr.length; i++) {
			res -= arr[i];
		}
		return res;
	}

方法二:位运算

public static int Solution(int[] arr) {
		int res = 0;
		for (int i = 0; i < arr.length; i++) {
			res ^= arr[i]^i;
			
		}
		System.out.println("res="+res+",arr.length="+arr.length);
		
		return res^arr.length;
	}

主函数:

public static void main(String[] args) {
		int[] arr = {8,6,9,2,3,5,7,0,1};
		int res = Solution(arr);
		System.out.println(res);
	}

二、在一个长度为n的数组里的所有数字都在0到n-1的范围内,找出数组中任意一个重复的数字。

  • 思路:
  • 对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。
    以 (2, 3, 1, 0, 2, 5) 为例,遍历到位置 4 时,该位置上的数为 2,但是第 2 个位置上已经有一个 2 的值了,因此可以知道 2 重复。

**时间复杂度为O(n),空间复杂度为O(1)。

public static int Solution(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			while(arr[i] != i) {
				if(arr[i] == arr[arr[i]]) {
					return arr[i];
				}
				swap(arr,arr[i],i);
			}
		}
		return -1;
	}
	private static void swap(int[] arr, int m, int n) {
		int temp = arr[m];
		arr[m] = arr[n];
		arr[n] = temp;
		
	}
	public static void main(String[] args) {
		int[] arr = {2, 3, 1, 0, 2 ,5};
		int res = Solution(arr);
		System.out.println(res);
	}
	
发布了114 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44026997/article/details/104966503