尝试按升序对0,1,2的向量进行排序。我认为以下两个是等价的:
void sortColors(vector<int>& nums) {
int i=0,j=nums.size()-1;
int k=0;
while (k<=j){
if (nums[k]==0){
swap(nums[i],nums[k]);
++i;
++k;
}
else if (nums[k]==1) {
++k;
}
else if (nums[k]==2){
swap(nums[j],nums[k]);
--j;
}
}
}
和
void sortColors(vector<int>& nums) {
int i=0,j=nums.size()-1;
int k=0;
while (k<=j){
if (nums[k]==0){
swap(nums[i],nums[k]);
++i;
++k;
}
if (nums[k]==1) ++k;
if (nums[k]==2){
swap(nums[j],nums[k]);
--j;
}
}
}
但是,只有第一个是正确的。当测试运行nums = {2,0}时,第一个执行正确的排序,而第二个函数不执行任何操作。这有什么区别?
答案 0 :(得分:2)
不,它们不相同,因为您更改了用于条件的变量:
while (k<=j){
if (nums[k]==0){
swap(nums[i],nums[k]);
++i;
++k;
}
if (nums[k]==1) ++k; // if num[k] == 1
if (nums[k]==2){ // now k isnt
// the same as for the last condition
swap(nums[j],nums[k]);
--j;
}
}
使用if-else
版本时,只执行其中一个分支。
答案 1 :(得分:1)
输出存在差异,但不是您需要知道的。你需要知道的是:
多个if语句意味着每个if块都有可能被执行。因此,如果您有N个条件,那么将执行0到N个块。
int a = 0;
if(a == 0)
a++;
if(a == 1)
a++;
if(a == 2)
a++;
if(a == 3)
a++;
所有这些都将执行,a将为4。
单行if / else if / else语句意味着每次使用它们时只会执行一个块。因此,如果您有N个条件,那么只会执行其中一个块。
int a = 20;
if(a == 0)
a++;
else if(a == 1)
a++;
else if(a == 2)
a++;
else
a = 0;
只执行else块,因此a将为0
最后,一行if / else if语句意味着AT MOST将执行一个块。有可能他们都没有执行,因为你没有最后的其他声明来捕捉&#34;其他一切&#34;。因此,如果您有N个条件,那么将执行0或1个块。
int a = 20;
if(a == 0)
a++;
else if(a == 1)
a++;
else if(a == 2)
a++;
else if(a == 3)
a++;
这些都没有执行,所以剩下的20
答案 2 :(得分:0)
不,他们不等同。因为第一个if之后将执行第二个if()
,如果首先在内部更改了k,它可能会触发。 else if
永远不会发生这种情况,因为else
在第一次if
被解雇时永远不会触发。