i = -1 在一段代码中的相关性
The relevance of i = -1 in a piece of code
我在研究一段代码,遇到了“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]);
}
提前致谢!
这是冒泡排序的一个实现。 i=-1;
如果发现排序不正确,则将循环重置为开头。它是 -1 而不是 0,因为 for 循环末尾的 i++
将它迭代回数组开头的 0。如果它不这样做,它只会通过一次,并且可能会错过顺序错误的东西。在这里阅读:http://www.geeksforgeeks.org/bubble-sort/
冒泡排序看起来像这样(在此代码中):
First pass: [0][3][3][1] the second 3 and 1 are swapped, the iterator
is back to the beginning
Second pass: [0][3][1][3] the first 3 and 1 are swapped
Third pass: [0][1][3][3] Nothing needs to be done
如果只通过一次,这是行不通的。因此,它会自行重置,以便再次通过。
(而且我应该注意,正如评论中提到的,冒泡排序首先是低效的,并且由于此实现在第一次出现问题时每次都会重置它,因此效率更低。 )
i=-1
用于从头重新开始for循环,以便再次遍历整个结构。请注意,i=-1
仅在算法发现无序的内容时才执行。
此构造用于实现作为参数传递的数组 'bubble sorting'。此代码的逻辑是从您在示例中看到的每个 'for' 循环开始检查数组。当循环发现数组的下一个元素未排序时,它会将其放入正确的顺序并从头开始检查数组。整个数组排序后退出循环。 x = - 1
- 此赋值的目的是从索引 0 开始下一个循环(如您所见,在 x
的每个循环值递增 1 之后([=16 中的 x++
部分=]循环),所以下一个循环从索引0开始)
它会重新启动 loop.Why?
因为你的排序算法(冒泡排序)一个一个地检查数字并交换它们。然后从头开始检查,直到所有数字都排序。让我们看看例子:
我们的号码是:
25 36 37 25 60
如果我们没有那个 i=-1;
然后程序会检查 25 是否大于 36 no.So 接下来检查 36 是否大于 37?否。所以接下来检查。如果 37 大于 25?是的所以交换 them.Now 我们有 :
25 36 25 37 60
如果 37 大于 60?否并完成。
但是如您所见,数组未排序。每次交换数字时,您都应该重新检查并重新开始循环。
为什么是-1?你从 i=0 开始循环;在循环之后你有 i++。 i=-1 之后 i++ 表示 i=0;表示从头开始循环。
本质上,这会找到 2 个乱序的邻居并交换它们。
然后它使用 i=-1
重新启动循环,因为在循环结束时,i
将递增 1,得到 i=0
。
它从循环的开头重新开始,因为现在 i-1
和 i
也可能顺序错误。
这是迄今为止最不理想的解决方案,因为它的运行时间为 O(n^2)。
PS: 因为很少有评论称这种冒泡排序,这是错误的。冒泡排序一直持续到数组末尾,然后才重新开始。
编辑:
这可以很容易地在 O(n) 时间内使用 O(1) 或常数 space 通过查找数组中的最小值和最大值并返回差值来执行。
请注意,整个函数并不是学习或模仿的好代码示例!
如果数组排序的副作用是可取的,这里有一个完全等效的实现,它将 运行 in O(n log n)
代替:
public static int bigDiff(int[] nums) {
Arrays.sort(nums);
return nums[nums.length - 1] - nums[0];
}
如果不需要数组排序的副作用,那么你可以returnO(n)
时间与O(1)
的差异space:
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;
}
请注意,这些实现中的 none 处理错误情况:如果 nums
是 null
,或者长度为零,等等
我在研究一段代码,遇到了“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]);
}
提前致谢!
这是冒泡排序的一个实现。 i=-1;
如果发现排序不正确,则将循环重置为开头。它是 -1 而不是 0,因为 for 循环末尾的 i++
将它迭代回数组开头的 0。如果它不这样做,它只会通过一次,并且可能会错过顺序错误的东西。在这里阅读:http://www.geeksforgeeks.org/bubble-sort/
冒泡排序看起来像这样(在此代码中):
First pass: [0][3][3][1] the second 3 and 1 are swapped, the iterator is back to the beginning
Second pass: [0][3][1][3] the first 3 and 1 are swapped
Third pass: [0][1][3][3] Nothing needs to be done
如果只通过一次,这是行不通的。因此,它会自行重置,以便再次通过。
(而且我应该注意,正如评论中提到的,冒泡排序首先是低效的,并且由于此实现在第一次出现问题时每次都会重置它,因此效率更低。 )
i=-1
用于从头重新开始for循环,以便再次遍历整个结构。请注意,i=-1
仅在算法发现无序的内容时才执行。
此构造用于实现作为参数传递的数组 'bubble sorting'。此代码的逻辑是从您在示例中看到的每个 'for' 循环开始检查数组。当循环发现数组的下一个元素未排序时,它会将其放入正确的顺序并从头开始检查数组。整个数组排序后退出循环。 x = - 1
- 此赋值的目的是从索引 0 开始下一个循环(如您所见,在 x
的每个循环值递增 1 之后([=16 中的 x++
部分=]循环),所以下一个循环从索引0开始)
它会重新启动 loop.Why?
因为你的排序算法(冒泡排序)一个一个地检查数字并交换它们。然后从头开始检查,直到所有数字都排序。让我们看看例子:
我们的号码是:
25 36 37 25 60
如果我们没有那个 i=-1; 然后程序会检查 25 是否大于 36 no.So 接下来检查 36 是否大于 37?否。所以接下来检查。如果 37 大于 25?是的所以交换 them.Now 我们有 :
25 36 25 37 60
如果 37 大于 60?否并完成。
但是如您所见,数组未排序。每次交换数字时,您都应该重新检查并重新开始循环。
为什么是-1?你从 i=0 开始循环;在循环之后你有 i++。 i=-1 之后 i++ 表示 i=0;表示从头开始循环。
本质上,这会找到 2 个乱序的邻居并交换它们。
然后它使用 i=-1
重新启动循环,因为在循环结束时,i
将递增 1,得到 i=0
。
它从循环的开头重新开始,因为现在 i-1
和 i
也可能顺序错误。
这是迄今为止最不理想的解决方案,因为它的运行时间为 O(n^2)。
PS: 因为很少有评论称这种冒泡排序,这是错误的。冒泡排序一直持续到数组末尾,然后才重新开始。
编辑: 这可以很容易地在 O(n) 时间内使用 O(1) 或常数 space 通过查找数组中的最小值和最大值并返回差值来执行。
请注意,整个函数并不是学习或模仿的好代码示例!
如果数组排序的副作用是可取的,这里有一个完全等效的实现,它将 运行 in O(n log n)
代替:
public static int bigDiff(int[] nums) {
Arrays.sort(nums);
return nums[nums.length - 1] - nums[0];
}
如果不需要数组排序的副作用,那么你可以returnO(n)
时间与O(1)
的差异space:
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;
}
请注意,这些实现中的 none 处理错误情况:如果 nums
是 null
,或者长度为零,等等