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)。
我错过了什么吗?
答案 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
找到更简单的解决方案