144.Interleaving Positive and Negative Numbers-交错正负数(中等题)

来源:互联网 发布:excel跨表格数据加法 编辑:程序博客网 时间:2024/06/05 17:45

交错正负数

  1. 题目

    给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。

    注意事项
    不需要保持正整数或者负整数原来的顺序。

  2. 样例

    给出数组[-1, -2, -3, 4, 5, 6],重新排序之后,变成[-1, 5, -2, 4, -3, 6]或者其他任何满足要求的答案

  3. 挑战

    原地完成,没有额外的空间

  4. 题解

    本题若要得到合理的答案,则数组中正负数的个数要么相等,要么比另一种数最多大1个。而题目没有保证正负数个数相等,所以需对数组进行预处理(数组长度为偶数时无需预处理),使得当正(负)数多时,数组第一个数为正(负)。
    至于交错正负数的处理就很简单了,双指针遍历即可。

class Solution {    /**     * @param A: An integer array.     * @return: void     */    public void rerange(int[] A) {        if (A.length % 2 == 1)        {            int count = 0;            int plus = 0;            int minus = 0;            for (int i=0;i<A.length;i++)            {                count += A[i] > 0 ? 1 : -1;                plus = A[i] > 0 ? i : plus;                minus = A[i] < 0 ? i : minus;            }            int i = count > 0 ? plus : minus;            swap(A,i,0);        }        range(A);   }   private void range(int[] A)   {        int left = 0;        while (left + 1 < A.length)        {            if (A[left] * A[left+1] < 0)            {                left++;            }            else            {                int j = A.length-1;                while (left < j)                {                    if (A[left] * A[j] < 0)                    {                        swap(A,left+1,j);                        left++;                        break;                    }                    j--;                }            }        }   }   private void swap(int[] A, int a, int b)   {       int tmp = A[a];       A[a] = A[b];       A[b] = tmp;   }}

Last Update 2016.10.17

0 0
原创粉丝点击