java 数组 去掉第一个_Day13 :调整数组顺序使奇数位于偶数前面

3a76c4bf6f51c30c28c7d4660109d0f7.png

剑指Offer_编程题——调整数组顺序使奇数位于偶数前面

题目描述:

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

具体要求:

时间限制: C/C++ 1秒,其他语言2秒
空间限制: C/C++32M,其他语言64M

具体思路:

思路一:

根据题意可知,我们不仅要让奇数在偶数的前面,还要考虑奇数和偶数原来的相对位置不变。因此我们首先要寻找第一个奇数,并将其放在0号位置。然后将第一个奇数之前的元素全部往后移一位。依次再第一个奇数之后的元素中寻找奇数,并做移动操作,就可以保证原来的相对顺序。

接下来我们用java实现

public class Solution{
	public static void reOrderArray(int [] array){
		int j = 0;
		int m = 0;
		for(int i = 0; i < array.length; i++){
			if(array[i] % 2 == 1){
				int temp = array[i];
				int ti = i;
				for(; ti > 0; ti --){
					array[ti] = array[ti - 1]; 
				}
				   array[0] = temp;
				   j = i;
				   break;
			}
		}
		for(++j; j < array.length; j++){
			if(array[j] % 2 == 1){
				int temp = array[j];
				int tj = j;
				for(; tj > m; tj--){
					array[tj] = array[tj - 1];
				}
					array[++m] = temp;
			}
		}
	}
}

代码效果图如图所示:

d41ce4f07272228579c9fa16c317dbab.png

&emsp;&emsp;在编译器中加入main()函数,进行代码可行性测试,具体测试代码实现入下:

public static void main(String[] args){
   int [] array = {2, 4, 6, 1, 3, 5, 7};
   reOrderArray(array);
   for(int i = 0; i < array.length; i++){
      System.out.println(array[i] + " ");
   }
}

&emsp;&emsp;代码测试通过如下图所示:

8ad4e7c2e04ae1a1f688ff8240fb4197.png

思路二:

还可以新建两个数组,分别存放奇数和偶数。然后再进行合并。具体用python来进行实现。

class Solution:
    def reOrderArray(self, array):
        # write code here
        a = []
        b = []
        for i in array:
            if i % 2 == 1:
                a.append(i)
            else:
                b.append(i)
        a.extend(b)
        return a

代码效果图如图所示:

36c1185d8feee42799f9ddbf6333e75c.png

拓展:

如果去掉并保证奇数和奇数,偶数和偶数之间的相对位置不变。还有另一种做法。我们可以用java将其实现,方法比较简单。只需要两个指针分别指向数组的头和尾,依次比较。具体实现步骤如下:

1、如果头指针指向数组位置为奇数,那么就判断尾指针指向的数组位置的奇偶性,如果是奇数,则头指针指向的数组位置为偶数,则尾指针前移一个位置。

2、如果头指针指向的数组位置为偶数,那么就判断尾指针指向的数组位置的奇偶性。如果是奇数,则交换头尾指针指向的数组元素,如果是偶数,则尾指针前移一个位置。

具体用java实现如下:

public class Solution{
    public static void main(String[] args){
      int [] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
      reOrderArray(array);
      for(int i = 0; i < array.length; i++){
         System.out.println(array[i] + " ");
     }
   }
   public static void reOrderArray(int [] array){
     int i = 0; 
     int j = array.length - 1;
     while(i < j){
       if(array[i] % 2 == 1){
             if(array[j] % 2 == 1){
                i++;
              }else{
                j--;
                }
           }else{
             if(array[j] % 2 == 1){
                 int temp = array[i];
                 array[i] = array[j];
                 array[j] = temp;
                }else{
                    j--;
                 }
             }
        }
   }
}

代码测试如图所示:

d6b9717a2dbbfbf895be39a7fbd82929.png

总结

&emsp;&emsp;本道题主要通过一个数组考察奇偶数的位置,并且特意强调调整位置后,要保证原来的相对位置。这就增加了一定的难度,这就需要寻找第一个奇数并放入数组的开头,然后继续将数组往后移动。然后,如果去掉这个“保持位置不变”的情况,则变得相对简单,只需要让两个指分别指向数组的头和尾,依次比较即可。总之,继续加油,争取早日找到工作,Good Luck!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值