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

时间:2022-07-24
本文章向大家介绍Day13 :调整数组顺序使奇数位于偶数前面,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指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;
			}
		}
	}
}

代码效果图如图所示:

  在编译器中加入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.pritnln(array[i] + " ");
	}
}

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

思路二:   还可以新建两个数组,分别存放奇数和偶数。然后再进行合并。具体用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

代码效果图如图所示:

拓展:   如果去掉并保证奇数和奇数,偶数和偶数之间的相对位置不变。还有另一种做法。我们可以用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--;
				}
			}
		}
	}
}

代码测试如图所示:

总结

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