CodingQuestion,找到所有缺失的数字

时间:2019-06-08 05:00:30

标签: arrays sorting

1) nums[i] != nums[nums[i]-1]
2) i != nums[i]-1

1)和2)有什么区别? 我无法找出它们之间的区别,但是如果我有代码2),则程序有错误,而不是1)。

这是我的问题的简要说明。 这是编码问题,它会在未排序的数组中找到所有丢失的数字,这些数组包含从1到n的数字。该数组可以有重复项,因此这意味着缺少soome号。 (-我想得到。)

Input: [2, 3, 1, 8, 2, 3, 5, 1] Output: 4, 6, 7 
The array should have all numbers from 1 to 8, due to duplicates 4, 6, and 7 are missing.

我知道肯定有解决此问题的更有效的方法,但是在这里我想使用循环排序模式来解决此问题,

  

在此问题中,数字的范围是从“ 1”到“ n”,因此我们   可以将每个数字放在正确的位置。例如,索引0:   1 /索引1:2 /索引2:3 ....依此类推。

public static List<Integer> findNumbers(int[] nums) {
int i = 0;
while (i < nums.length) {
  if (nums[i] != nums[nums[i] - 1])
    swap(nums, i, nums[i] - 1);
  else
    i++;
}

List<Integer> missingNumbers = new ArrayList<>();
for (i = 0; i < nums.length; i++)
  if (nums[i] != i + 1)
    missingNumbers.add(i + 1);

return missingNumbers;   }

所以回到我的问题,我找不到1)和2)之间的任何区别。 因为总是索引0应该有1,索引1应该有2,索引2应该有3。所以我认为我可以简单地使用以下模式:2)i!= nums [i] -1而不是1)。

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

以下条件不同-

1) nums[i] != nums[nums[i]-1] 2) i != nums[i]-1

示例:

let i = 0
const nums = [2, 3, 1, 8, 2, 3, 5, 1];

nums[i] != nums[nums[i]-1];
nums[0] != nums[nums[0]-1];
2 != nums[2-1];
2 != 3; 

在这种情况下,您正在检查当前索引处的元素和下一个索引处的元素。

i != nums[i]-1
0 != nums[0]-1;
0 != 2-1
0 != 1;

在这种情况下,您正在检查current index是否等于数组中当前索引减一的元素。

您的not equal to逻辑将不起作用。为了进行正确的排序,您必须使用greater than(>) or less than(<)。对于升序,仅当当前索引项大于下一个索引项时,才应进行交换。

答案 1 :(得分:0)

while (i < nums.length) {
  if (nums[i] != nums[nums[i] - 1])
    swap(nums, i, nums[i] - 1);
  else
    i++;
}

让我们弄清楚该解决方案中可能出什么问题。该算法获得元素0的值10和元素9的值(因为nums[i] - 1为9)。例如,将其设为10。并且算法前进,因为值相等。如您所见,这是您问题的答案:

nums[i] != nums[nums[i]-1]-与源数组中的随机数进行比较。它会为您的示例以及前两个位置的数字2和3带来真正有趣的无限循环。

i != nums[i] - 1-将当前值与确实必须放置在该位置的索引进行比较。

如果数组的长度小于最大数量,则也很容易获得IndexOutOfBoundsException。但据我所知,这不是练习的一部分。

正如我所看到的,您正在尝试解决此问题而没有其他阵列。但是您可以在这里https://javarevisited.blogspot.com/2018/04/how-to-find-k-missing-numbers-in-array-java.html

找到更简单的解决方案