核心理解点

题目的意思是每次只能用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--;
        }
    }

此类题目需要多思考!