zoukankan      html  css  js  c++  java
  • [jobdu]调整数组顺序使奇数位于偶数前面

    这道题的代码没啥好说的,用了O(n)的空间就是水题了。但可以讲一下思考过程。
    一开始是想O(1)的空间的,然后想从左往右双指针扫,然后根据出现顺序交换遇到的偶数和奇数。但遇到一个问题:
    1, 2, 3, 4, 5; 第一次交换完是 1, 3, 2, 4, 5;但再往右扫就会再次碰到2这个偶数,又会和5交换,成为1, 3, 5, 4, 2, 错误!
    试了一下别的交换方法,也不行。想了想,觉得当出现这种奇数偶数交替出现的情况,单靠这样交换是不行的,因为第一个偶数要出现在所有奇数完了之后的位置。
    想了另一个角度,一个指针在最左,一个指针在最右。然后两边往中间扫,但这道题又要保持原序,又不行。
    最后看了别人的做法,是O(n)的空间开个数组,那就没啥特别了。。。
    HHT的这道题本来是不需要保持原序的,九度这就经常变一下,也不知道好还是坏。
    另外一个经验是方法想出来后,先拿小数组test一下,否则错的方法写完代码再改太费时间了。

    代码里唯一有点意思的是使用了a&1 == 0来判断奇偶性。

    但其实在O(1)的空间限制下,有个n*logn的解法(分治法),有空写一下:http://qing.blog.sina.com.cn/1570303725/5d98eeed33000hcb.html

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner cin = new Scanner(System.in);
            int n;
            int[] a;
            while (cin.hasNextInt()) {
                n = cin.nextInt();
                a = new int[n];
                for (int i = 0; i < n; i++) {
                    a[i] = cin.nextInt();
                }
                partition(a, n);
                for (int i = 0; i < n-1; i++)
                {
                    System.out.print(a[i]+" ");
                }
                System.out.println(a[n-1]);
            }
        }
    
        public static void partition(int a[], int n) {
            int[] b = new int[n];
            int k = 0;
            for (int i = 0; i < n; i++)
            {
                if ((a[i] & 1) != 0)
                {
                    b[k] = a[i];
                    k++;
                }
            }
            for (int i = 0; i < n; i++)
            {
                if ((a[i] & 1) == 0)
                {
                    b[k] = a[i];
                    k++;
                }
            }
            for (int i = 0; i < n; i++)
            {
                a[i] = b[i];
            }
        }
    }
    

      

  • 相关阅读:
    【转】简单地用nfs实现linux间文件共享
    CentOS 6.1上部署SVN时遇到的问题及解决方法
    ubuntu下部署SVN服务
    LINUX GBK>UTF8文件编码批量转换脚本[转]
    Thinkpad E420 3YC(双显卡)安装64位Ubuntu 11.10笔记
    拦截器详解
    快排的算法
    冒泡排序的算法
    struts2的输入校验
    ssh整合开发
  • 原文地址:https://www.cnblogs.com/lautsie/p/3348665.html
Copyright © 2011-2022 走看看