百度面试题:度度熊排序

题目描述:

  度度熊有一个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次操作操作的下标、以及对象和中间过程。

时间: 2024-08-03 16:18:28

百度面试题:度度熊排序的相关文章

(百度17春招笔试题) 度度熊回家

时间限制:1秒 空间限制:32768K 一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家.现在他需要依次的从0号坐标走到N-1号坐标.但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离? 输入描述: 输入一个正整数N, N <= 50. 接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向.绝对值小于等于100 输出描述: 输出一个整数表示度度熊最少需要走的距离. 输入例子: 4 1

度度熊的午饭时光 2017百度之星资格赛 -.-

度度熊的午饭时光 Accepts: 755 Submissions: 8737 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 度度熊最期待每天的午饭时光,因为早饭菜品清淡,晚饭减肥不敢吃太多(胖纸的忧伤T.T). 百度食堂的午餐超级丰富,祖国各大菜系应有尽有,度度熊在每个窗口都有爱吃的菜品,而且他还为喜爱的菜品打了分,吃货的情怀呀(>.<)

hdu 6082 度度熊与邪恶大魔王(2017&quot;百度之星&quot;程序设计大赛 - 资格赛 )

度度熊与邪恶大魔王 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 251    Accepted Submission(s): 125 Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来.邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力.度度熊一共拥有m种攻击方式,第i

百度之星2017 HDU 6119 小小粉丝度度熊 二分+双指针

小小粉丝度度熊 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6119 Description 度度熊喜欢着喵哈哈村的大明星--星星小姐.为什么度度熊会喜欢星星小姐呢?首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听.但这都不是最重要的,最重要的是,星星小姐拍的一手好代码!于是度度熊关注了星星小姐的贴吧.一开始度度熊决定每天都在星星小姐的贴吧里面签到.但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到.不过

(最小费用流)hdu 6118(2017百度之星初赛B 1005) 度度熊的交易计划

度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 260    Accepted Submission(s): 83 Problem Description 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片

2017百度之星资格赛 度度熊的王国战略

度度熊的王国战略 Accepts: 644 Submissions: 5880 Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 32768/132768 K (Java/Others) Problem Description 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更好的进攻哗啦啦族,度度熊决定首先应该从内部瓦解哗啦啦

HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(B))

小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1572    Accepted Submission(s): 513 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是

HDU 6113 度度熊的01世界 【DFS】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))

度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1117    Accepted Submission(s): 400 Problem Description 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是. 图像0

2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-inverse #navbar > .navbar-nav > li > a:hover, .navbar-inverse #navbar > .navbar-nav > li > a:focus { background-image: none; background-color: