剑指offer:调整数组顺序使奇数位于偶数前面

调整数组顺序使奇数位于偶数前面

http://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593

思路:

  1. 开辟新数组保存法:创建两个数组,一个用来存奇数,一个用来存偶数,最后合并。

  2. 不开辟新数组:

    • 1.用两个下标i,j进行遍历;
    • 2.当i走到偶数时停下,并让j从i的后一个元素开始遍历;(若i走到队尾则循环结束)
    • 3.若j所指的是偶数则继续前进,j遇到奇数则停下(如果j都没遇到奇数则在队尾停下,结束。)。
    • 4.此时j所指的是奇数,i所指的是偶数(i到j-1都是偶数)。
    • 5.则可以用临时变量temp保存j对应的值,然后从j-1开始到i,挨个后移一位。
    • 6.将temp保存的值插入到i的位置。
  3. 优化:冒泡排序也可以保证相对位置不变,所以用冒泡排序写起来会更方便。

    答案:

  4. 不开辟新数组:

    public class Solution {
      public void reOrderArray(int[] array) {
          int len = array.length;
          if (len <= 1) {
              return;
          }
          int i = 0;
          while (i < len) {
              //如果i所指的元素是奇数,则继续前进
              if (array[i] % 2 == 1) {
                  i++;
              } else {
                  //当i遇到偶数停下时,j从i的后一位开始走
                  int j = i + 1;
                  //当j所指的元素也是偶数时,则j向后移动
                  while (array[j] % 2 == 0) {
                      //当j移到队尾,则说明i到队尾全是偶数,已满足题目的奇偶分离要求
                      if (j == len - 1) {
                          return;
                      }
                      j++;
                  }
                  //此时j为奇数,i为偶数,用temp保存array[j]的值
                  int temp = array[j];
                  //把i到j-1的元素往后移一位
                  while (j > i) {
                      array[j] = array[j - 1];
                      j--;
                  }
                  //把保存在temp中的原第j个元素的值赋给i,此时i就变成奇数了,并进入下个循环
                  array[i] = temp;
              }
    
          }
      }
    }
全部评论
你这个代码都没通过啊兄嘚
点赞 回复
分享
发布于 2019-12-05 22:21
这个代码确实通不过,改一下 int j = i;就可
点赞 回复
分享
发布于 2020-03-29 10:28
滴滴
校招火热招聘中
官网直投
把array.length改为arraty.size()
点赞 回复
分享
发布于 2020-04-27 20:08
辅助数组一个就够了,原数组两个指针(头指针,尾指针)分别从头和尾开始遍历,遍历遇到奇数从前往后插入辅助数组,遇到偶数从后往前插入辅助数组。
点赞 回复
分享
发布于 2020-04-30 22:34

相关推荐

7 收藏 评论
分享
牛客网
牛客企业服务