The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of the numbers in the set got duplicated to another number in the set, which results in repetition of one number and loss of another number.
Given an array nums representing the data status of this set after the error. Your task is to firstly find the number occurs twice and then find the number that is missing. Return them in the form of an array.
出现了数值和索引一致,并且各异这种极好的条件,所以可以考虑索引排序。
问题是怎么写索引排序。在所有数都不同的情况下,考虑到每个数值都会对应唯一一个索引,如果在原来数组的位置I-1上对应的NUMS[I]!=i-1,那么明显的nums[i]应该被放到nums[i]-1上去,此时数组[nums[i]-1]位置上肯定也有一对这样的不匹配(因为nums[i]应该被放在nums[i]-1的位置上,由各异可以知道这个位置上只能有一个,明显的现在nums[i]-1位置上的数不是nums[i])。换句话说,对于没有重复值只存在1.两个位置上的数都不符合条件。2.两个位置上的数都符合条件,这两种情况。
现在,出现了重复元素,出现了第三种情况,即一个符合,一个不符合。这种情况,只有在这个元素是重复元素时才会出现。所以我们直接跳过元素就好了
注意在swap时一定要保证交换以后一定是num[i]=i+1,数组满足排定,所以用的whlle循环。
class Solution {
public int[] findErrorNums(int[] nums) {
int[] result= new int[2];
for(int i = 0 ;i<nums.length;i++)
{
while(nums[i]!=i+1&&nums[nums[i]-1]!=nums[i])
swap(nums,i,nums[i]-1);
}
// 排定数组
for(int i = 0 ;i<nums.length;i++)
{
if(nums[i]!=i+1)
{
result[0]=nums[i];
result[1]=nums[i+1];
}
return result;
}
private void swap (int[] nums,int i ,int j )
{
int temp =nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
排序后遍历找到第一个不满足条件的数。