百度面試題:度度熊排序


題目描述:

  度度熊有一個N個數的數組,他想將數組從小到大排好序,但是萌萌的度度熊只會下面這個操作:

  任取數組中的一個數然后將它放置在數組的最后一個位置。

  

  問最少操作多少次可以使得數組從小到大有序?

輸入描述:

  首先輸入一個正整數N,接下來的一行輸入N個整數。(N<=50,每個數的絕對值小於等於1000)

輸出描述

  輸出一個整數表示最少的操作次數

輸入例子:

  4

  19 7 3 25

輸出例子:

  3

 

思路:

  首先我們知道,度度熊只會從數組中拿一個數,放置到最后面;而且,給你的數組是手動給的,未知的。故此,需要找到度度熊每次操作的策略才能夠得到最少的操作次數。

  想要最少的操作次數來將排序完成,且是從小到大。所以必須得知道從小到大的排序是什么樣子的。

  還有在操作過程中,我們只有在遇到逆序對的時候才會需要操作的。

  這時就發現,逆序對這個概念的存在了。就是形如“……,3,……,1,……”是不滿足從大到小,是逆序對,我們絕對需要對其中的大的數進行操作。

  故而就發現,我們每次操作都是先找逆序對,再進行操作。因為是需要從小到大排序,那么得先從最小的逆序對尋找。然后操作較大的數。

  以“19 7 3 25”為例:

      其從小到大排序為“3 7 19 25”,

      故而先看“3”和“7”是否為逆序對,

        如果是那么把“7”移動到最后

      接下來繼續看“7”和“19”是否為逆序對,

      以此類推。

實現:

 

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main (String args[]){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] a=new int[n];
		for(int i=0;i<a.length;i++){
			a[i]=sc.nextInt();
		}
		sc.close();
		int[] b=Arrays.copyOfRange(a, 0, a.length);
		Arrays.sort(b);
		int count = 0;
		for(int j = 0; j< a.length-1;j++){
			int min = b[j];
			int max = b[j+1];
			int minNum = -1;
			int maxNum = -1;
			for(int i=0;i<a.length;i++){
				if(a[i]==min)
					minNum = i;
				if(a[i]==max)
					maxNum = i;
				if(minNum!=-1 && maxNum!=-1){
					break;
				}
			}
			System.out.println("minNum:"+b[j]+":"+minNum+"\nmaxNum:"+b[j+1]+":"+maxNum);
			if (maxNum<minNum){
				count++;
				int[] aa = Arrays.copyOfRange(a, 0, maxNum);
				int[] ab = Arrays.copyOfRange(a, maxNum+1, a.length);
				for(int i = 0;i<aa.length;i++){
					System.out.print(aa[i]+" ");
				}
				System.out.println();
				for(int i = 0;i<ab.length;i++){
					System.out.print(ab[i]+" ");
				}
				System.out.println();
				int[] ac = {b[j+1]};
				System.arraycopy(ab, 0, a, aa.length, ab.length);
				System.arraycopy(ac, 0, a, aa.length+ab.length, ac.length);
				for(int i = 0;i<a.length;i++){
					System.out.print(a[i]+" ");
				}
				System.out.println();
			}
		}
		System.out.println(count);
	}
}

實現輸出

4
19 7 3 25
minNum:3:2
maxNum:7:1
19
3 25
19 3 25 7
minNum:7:3
maxNum:19:0

3 25 7
3 25 7 19
minNum:19:3
maxNum:25:1
3
7 19
3 7 19 25
3

  上述顯示了3次操作操作的下標、以及對象和中間過程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM