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

    在这里插入图片描述

    双指针

    lo指针指向数组前,hi指针指向数组尾部,lo指针向后移动直至指向的元素为偶数,hi指针向前移动直至指向的元素为奇数,然后交换两个指针所指元数的位置。

    class Solution {
        public int[] exchange(int[] nums) {
            int lo = 0, hi = nums.length - 1;
            while(hi > lo){
                //向后移动指针lo直到遇到一个偶数
                while(lo < hi && (nums[lo] & 0x01) != 0){//与运算判断奇偶速度更快
                    ++lo;
                }
                //向前移动指针hi直到遇到一个奇数
                while(lo < hi && (nums[hi] & 0x01) == 0){
                    --hi;
                }
                if(lo < hi){
                    exch(nums, lo, hi);
                }
            }
            return nums;
        }
    
        private void exch(int[] nums, int lo, int hi){
            int temp = nums[lo];
            nums[lo] = nums[hi];
            nums[hi] = temp;
        }
    }
    

    可扩展解法

    与这题类似的问题可能还有:
    1、把负数移动到非负数前面
    2、把能被3整除的数,移动到不能被3整除的数前面
    这一类问题都属于类似问题,只需要改变代码中的判断标准,因此在java中可以使用策略模式来设计一个函数,可以求解一类问题。需要做的只是实现CompareHandler接口,实现其中的handler方法。不同的实现方式对应解决类似的问题。

    class Solution {
        public int[] exchange(int[] nums) {
            return exchange(nums, new IsEven());
        }
    
        private int[] exchange(int[] nums, CompareHandler cmpHandler){
            int lo = 0, hi = nums.length - 1;
            while(lo < hi){
                while(lo < hi && !cmpHandler.handler(nums[lo])){
                    ++lo;
                }
                while(lo < hi && cmpHandler.handler(nums[hi])){
                    --hi;
                }
                if(lo < hi){
                    exch(nums, lo, hi);
                }
            }
            return nums;
        }
    
        private void exch(int[] nums, int lo, int hi){
            int temp = nums[lo];
            nums[lo] = nums[hi];
            nums[hi] = temp;
        }
    
        interface CompareHandler {
            boolean handler(int num);
        }
    
        class IsEven implements CompareHandler {
            public boolean handler(int num){
                if((num & 0x01) == 0)
                    return true;
                return false;
            }
        }
    }
    
  • 相关阅读:
    P1726 上白泽慧音
    P1993 小k的农场
    P1983 车站分级
    P1525 关押罪犯【二分+二分图】
    P1268 树的重量【构造】
    P1113 杂务
    F.Three pahs on a tree
    P1522 牛的旅行
    两个约束下的dp问题
    dp 最大正方形
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13859969.html
Copyright © 2011-2022 走看看