我正在学习一段代码而且我遇到了#34; i = -1
"我无法弄清楚它在场景中的重要性。
代码的要点是将数组从最小到最大排序,找到最大和最小数字之间的差异。
public int bigDiff(int[] nums) {
int answer = 0;
for (int i = 0; i < nums.length - 1; i++){
if (nums[i] > nums[i + 1]){
int temp = nums[i];
nums[i] = nums[i + 1];
nums[i + 1] = temp;
i = -1;
}
}
return (nums[nums.length - 1] - nums[0]);
}
提前致谢!
答案 0 :(得分:1)
这是冒泡排序的实现。 i=-1;
如果发现某些内容未正确排序,则会将循环重置为开头。它是-1而不是0,因为for循环结束时的i++
会将其迭代回0以获得数组的开头。如果它没有做到这一点,它只会进行一次通过,它可能会错过错误顺序的事情。在此处阅读:http://www.geeksforgeeks.org/bubble-sort/
冒泡排序看起来像这样(在此代码中):
第一遍:[0] [3] [3] [1]交换第二个3和1,迭代器 回到了开头
第二遍:[0] [3] [1] [3]前3和1被交换
第三关:[0] [1] [3] [3]没有什么需要做的
如果它只进行一次通过,那就不会有效。因此,它会自行重置,因此可以再次通过。
(我应该注意到,正如评论中所提到的,冒泡排序首先是低效率的,并且由于此实现每次在第一次出现问题时都会重置它,因此效率更低。)< / p>
答案 1 :(得分:1)
i=-1
用于从头开始重新启动for循环,以便再次遍历整个结构。请注意,i=-1
仅在算法找到无序的内容时执行。
答案 2 :(得分:0)
这种结构用于实现泡沫分类&#39;作为参数传递的数组。这段代码的逻辑是从一开始就用每个&#39; for&#39;来检查数组。你在例子中看到的循环。当循环发现数组的下一个元素没有排序时,它会以正确的顺序放置它并从头开始检查数组。整个数组排序时退出循环。 x = - 1
- 此分配的目的是从索引0开始下一个循环(如您所见,在x
的每个循环值增加1之后(&{39}中的x++
部分;对于&#39;循环),所以下一个循环从索引0开始
答案 3 :(得分:0)
重启循环。为什么?
因为您的排序算法(冒泡排序)逐个检查数字并交换它们。然后从头开始检查,直到所有数字都被排序。让我们看看并举例:
我们的号码是:
25 36 37 25 60
如果我们没有i = -1; 然后程序将检查25是否大于36否。所以下一个检查,如果36大于37?接下来检查一下。如果37大于25?是的,所以交换它们。现在我们有:
25 36 25 37 60
如果37大于60?不,不完整。
但是你看到数组没有排序。每次交换数字时都应该重新检查并重新开始循环。
为什么-1?你从i = 0开始循环;在循环之后你有i ++。 i = -1,之后i ++表示i = 0;这意味着从头开始循环。
答案 4 :(得分:0)
基本上,这会找到2个乱序的邻居并交换它们。
然后它使用i=-1
重新启动循环,因为在循环结束时,i
将增加1,得到i=0
。
它从循环开始重新开始,因为现在i-1
和i
的顺序也可能错误。
到目前为止,这是最不理想的解决方案,因为它在O(n ^ 2)时间内运行。
PS:由于很少有评论称这种冒泡排序,这是错误的。在重新启动之前,冒泡排序会一直持续到阵列结束。
编辑: 通过找到数组中的最小值和最大值并返回差值,可以在O(n)时间内使用O(1)或常量空间轻松执行此操作。
答案 5 :(得分:0)
请注意,整个功能不是学习或模仿的好代码的示例!
如果需要对数组进行排序的副作用,那么这是一个完全等效的实现,它将在O(n log n)
中运行:
public static int bigDiff(int[] nums) {
Arrays.sort(nums);
return nums[nums.length - 1] - nums[0];
}
如果不需要对数组进行排序的副作用,那么您可以使用O(n)
空格返回O(1)
时间内的差异:
public static int bigDiff(int[] nums) {
int highest = nums[0];
int lowest = nums[0];
for (int num : nums) {
if (num > highest) {
highest = num;
}
if (num < lowest) {
lowest = num;
}
}
return highest - lowest;
}
请注意,这些实现都不会处理错误情况:如果nums
为null
,或者长度为零,等等。