剑指offer第二版——面试题21(java)

面试题21:调整数组顺序使奇数位于偶数前面

题目:

输入一个整数数组,实现一个函数来调整数组中的数字顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分

自己的思路:

直接交换偶数结点和奇数结点的值

先找到第一个偶数,再找到第一个奇数,替换;

 

书上思路:

交换结点的值,但是是两个指针从头、尾两边分别往中间挪动

【优点】每次两个节点的比较可以独立出来写一个函数,在需要改变判断标准时,可以只对该函数进行更改

 

代码:

自己的方法

public class Q21 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] myList = new int[] {1,2,3,4,5,6,7};
		reOrderOddEven1(myList);
		
		System.out.print("list:");
		for(int i=0;i<=myList.length-1;i++) {
			System.out.printf("%d ", myList[i]);
		}
	}
	
	public static void reOrderOddEven(int[] myList) {
		if(myList.length>1) {
			int evenloc = 0;
			while(evenloc<=myList.length-2) {
				// 偶数  这里也可以改成tellVal==false
				if(myList[evenloc]%2==0) {
					int moveloc = evenloc+1;
					while(moveloc<=myList.length-1) {
						// 奇数 这里也可以改成tellVal==true
						if(myList[moveloc]%2==1) {
							// 交换
							swap(evenloc, moveloc, myList);
							break;
						}
						moveloc++;
					}
				}
				// 奇数
				evenloc++;			
			}	
		}
	}
	
	public static boolean tellVal(int x) {
		return  (x%2==1);
	}
	
	public static void swap(int i,int j,int[] list) {
		int temp = list[i];
		list[i] = list[j];
		list[j] = temp;
	}
}

书上的方法:

(有点像快排的一小步)

	public static void reOrderOddEven1(int[] myList) {
		int tail = myList.length-1;
		int head = 0;
		while(tail>head) {
			while(head

 

最开始写成链表了QAQ,写都写了也就放这里吧

public class Q21 {
	public static void main(String[] args) {
		System.out.printf("input your list:");
		Scanner sc = new Scanner(System.in);
		ListNode head = new ListNode(0);
		ListNode node = head;
		// 获取int链表 输入非int值结束
		while(sc.hasNextInt()) {
			ListNode temp = new ListNode(sc.nextInt());
			node.next = temp;
			node = temp;
		}
		head = head.next;
		showList(head);
		reOrderOddEven(head);
		showList(head);	
	}
	
	public static void reOrderOddEven(ListNode head) {
		ListNode evenNode = head;
		ListNode locNode;
		int temp;
		while(evenNode!=null) {
			// 寻找需要替换的偶数
			if(evenNode.val%2==0) {
				locNode = evenNode.next;
				while(locNode!=null) {
					// 在定位的偶数之后 遇到奇数 交换后跳出
					if(locNode.val%2==1) {
						temp = locNode.val;
						locNode.val = evenNode.val;
						evenNode.val = temp;
						break;
					}
					// 在定位的偶数之后遇到偶数 继续往下寻找
						locNode = locNode.next;
				}
			}
			// 未寻找到偶数 下一个位置
			evenNode = evenNode.next;
		}
	}
	
	public static void showList(ListNode head) {
		System.out.print("your list:");
		while(head!=null) {
			System.out.printf("%d ", head.val);
			head = head.next;
		}
		System.out.println();
	}
}

你可能感兴趣的:(剑指offer第二版)