尝试按升序对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}时,第一个函数执行正确的排序,而第二个函数不执行任何操作。这里有什么区别?
不,它们不一样,因为您更改了用于条件的变量:
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;
}
}
而对于CCD_ 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一个块。它们都有可能不会执行,因为你没有最终的else语句来捕捉"其他一切"。所以,如果你有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++;
这些都不执行,所以a保持20
不,它们不等价。因为第二个if()
将在第一个if之后执行,所以如果在第一个if内部更改了k,它可能会激发。else if
永远不会发生这种情况,因为如果第一个if
激发,else
永远不会激发。