有点类似的两道题:
一、给定一个包含 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);
}