《剑指offer》第13题——移动数组元素奇数在前偶数在后

207 阅读1分钟

题目:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变

思路:

考虑直接插入排序的思想,将后面的奇数依次插入到偶数前

Java

package nowcoder;

public class S13_reOrderArray {
    //利用直接插入排序的思想
    public void reOrderArray(int[] array){
        int n = array.length;
        int i=0;
        while (i<n){
            if (array[i]%2 ==1)
                i++; //i记录前面第一个偶数的下标
            else {
                int j=i+1;
                while (j<n && array[j]%2==0)
                    j++;
                if (j >= n)
                    break;
                int temp = array[j]; //找到又一个奇数
                while (j > i) {
                    array[j] = array[j-1];
                    j--;
                }
                array[i] = temp;
                i ++;
            }
        }
    }
    public static void main(String[] args){
        S13_reOrderArray s13 = new S13_reOrderArray();
        int[] arr = {1,2,4,6,8,5,7,9};
        s13.reOrderArray(arr);
        for (int i=0;i<arr.length;i++)
            System.out.print(arr[i]+" ");
    }
}

Python

class ReOrderArray:
    def reOrderArray(self, array):
        i = 0
        while i < len(array):
            if array[i] % 2 == 1:
                i += 1
            else:
                j = i + 1
                while j< len(array) and array[j] % 2 == 0:
                    j += 1
                if j >= len(array):
                    break
                temp = array[j]
                while j > i:
                    array[j] = array[j-1]
                    j -= 1
                array[i] = temp
                i += 1
if __name__ == '__main__':
    test = ReOrderArray()
    array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    test.reOrderArray(array)
    for i in range(len(array)):
        print(array[i], end=" ")

或者:

    def reOrderArray(self, array):
        lo = []
        le = []
        for i in range(len(array)):
            if array[i] % 2 == 1:
                le.append(array[i])
            else:
                lo.append(array[i])
        return le + lo

结果:

1 3 5 7 9 2 4 6 8 
Process finished with exit code 0