笔试算法题总结

题目:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。

思路分析:

# 奇数分类到低位,偶数分类到高位

# 从低位开始检查,如果是奇数就继续,直到遇到偶数停止;然后开始从高位开始检查,如果是偶数就继续,直到遇到奇数位置;

# 一轮检查完成后交换高位和低位停止的元素,然后进行下一轮检查,以此类推,直到高位和低位的差值为1时认为检查分类完成,退出。

python 代码实现:

def OddEvenSorter(arr):
  # 处理空数组
  if not arr:
    return None
  # 初始化奇数指针和偶数指针
  odd_pointer = 0
  even_pointer = len(arr) - 1

  while True:
    # 从奇数指针处开始检查当前元素是否为奇数,是奇数就向后继续检查,直到遇到偶数停下
    while (arr[odd_pointer] % 2) == 1 and even_pointer - odd_pointer > 1:
      odd_pointer += 1
    # 从偶数指针处开始检查当前元素是否为偶数,是偶数就向后继续检查,直到遇到奇数停下
    while arr[even_pointer] % 2 == 0 and even_pointer - odd_pointer > 1:
      even_pointer -= 1
    # 此时的奇数指针所指元素为偶数,偶数指针指向奇数,所以交换奇偶指针处的元素
    tmp = arr[odd_pointer]
    arr[odd_pointer] = arr[even_pointer]
    arr[even_pointer] = tmp
    # 如果奇偶指针相差为1则停止检查
    if even_pointer - odd_pointer <= 1:
      break

测试:

if __name__ == "__main__":
  a = [1, 2,3 ,8, 19, 30, 88, 76,31]
  OddEvenSorter(a)
  print(a)

java实现:

package test;

import java.util.Arrays;

public class Sort {
	public static void main(String[] args){
		int[] str = new int[]{1,4,53,6,2,43,45,2,6};
		System.out.println(Arrays.toString(sortStr(str)));
	}
	public static int[] sortStr(int[] str){
		int pre=0;
		int post = str.length-1;
		int temp;
		if (str.length<=1){
			return str;
		}
		while(true){
			//是奇数
			while(str[pre]%2==1 && pre<post){
				pre++;
			}
			//是偶数
			while(str[post]%2==0 && pre<post){
				post--;
			}
			if(pre<post){
				temp = str[pre];
				str[pre]= str[post];
				str[post] = temp;
			}else{
				break;
			}
		}
		
		return str;
	}
}

猜你喜欢

转载自blog.csdn.net/fhy569039351/article/details/82183750