核心理解点
题目的意思是每次只能用0和另一个数进行交换。
所以这里想的是,尽可能每次都往正确的位置上换。
所以,一个数组,谁来作为键,谁来作为值,就很重要了。这里要交换,数字是不变的,变化的是数字的位置,所以,用一个for循环,可以把初始的位置,以值得形式记录下来。
关于交换得误区
比如,一开始0的位置是7,这个位置7的正确值应该是数字7,所以,0要和7交换位置。交换之后,数字7就归位了,即不需要再动了,这里可以用一个flag作为循环的条件。
但是,如果数字0正好自己换到了位置0呢?并且这个时候还有未正常归位的数字,所以这个时候想到的就是,找一个最小的未归位数字,和它交换位置,但这里并没有让交换的另一个数字正常归位。
这样,0就可以继续用正确位置和正确数字进行交换,直到最后一步,交换后各自回到正确的位置。
核心实现:
int posNot = 1;//not in right position
while (leftN > 0) {
if (num[0] == 0) {
while (posNot < N) {
if(num[posNot] != posNot) {
swap(num[0], num[posNot]);
times++;
break;// continue next while to swap
}
posNot++;
}
}
while (num[0] != 0) {
swap(num[0], num[num[0]]);
times++;
leftN--;
}
}
此类题目需要多思考!