zoukankan      html  css  js  c++  java
  • 剑指Offer-调整数组顺序使奇数位于偶数前面

    题目描述

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

    思路

    思路一:

    首先统计奇数的个数,然后拷贝一个数组,设置两个指针,奇数指针从0开始,偶数指针从奇数个数的末尾开始遍历,填充到原数组

    时间复杂度$O(n)$ 空间复杂度$O(n)$

    思路二:

    由于要保证稳定即证奇数和奇数,偶数和偶数之间的相对位置不变,使用插入排序思想

    时间复杂度$O(n^2)$ 空间复杂度$O(1)$

    代码实现

    package Array;
    
    /**
     * 调整数组顺序使奇数位于偶数前面
     * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
     */
    public class Solution48 {
        public static void main(String[] args) {
            Solution48 solution48 = new Solution48();
            int[] array = {1, 2, 3, 4, 5, 6};
            solution48.reOrderArray_2(array);
            for (int i :
                    array) {
                System.out.print(i + " ");
            }
        }
    
        /**
         * 由于要保证稳定即证奇数和奇数,偶数和偶数之间的相对位置不变,使用插入排序思想
         * 复杂度:O(N2) + O(1)
         *
         * @param array
         */
        public void reOrderArray_2(int[] array) {
            if (array.length == 0 || array == null)
                return;
            int n = array.length;
            for (int i = 0; i < n; i++) {
                if (array[i] % 2 == 0) {
                    int nextOddIdx = i + 1;
                    while (nextOddIdx < n && array[nextOddIdx] % 2 == 0) {
                        nextOddIdx++;
                    }
                    if (nextOddIdx == n) {
                        break;
                    }
                    int nextOddVal = array[nextOddIdx];
                    for (int j = nextOddIdx; j > i; j--) {
                        array[j] = array[j - 1];
                    }
                    array[i] = nextOddVal;
                }
            }
        }
    
        /**
         * 新建一个数组
         * 复杂度:O(N) + O(N)
         *
         * @param array
         */
        public void reOrderArray(int[] array) {
            int oddCnt = 0;
            for (int val : array) {
                if (val % 2 == 1) {
                    oddCnt++;
                }
            }
            int[] copy = array.clone();
            int i = 0, j = oddCnt;
            for (int num : copy) {
                if (num % 2 == 1) {
                    array[i++] = num;
                } else {
                    array[j++] = num;
                }
            }
        }
    }
    
    
  • 相关阅读:
    wpf 计算公式
    c#读取文件
    wpf布局控件总结
    一个接口多次使用的值得引起思考的小片段
    wpf之渐变色LinearGradientBrush
    路由
    HtmlHelper2
    HtmlHelper1
    ssh连接Ubuntu之access denied
    百万级数据库优化方案
  • 原文地址:https://www.cnblogs.com/wupeixuan/p/8795151.html
Copyright © 2011-2022 走看看