百度面试题:度度熊排序
题目描述:
度度熊有一个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”是否为逆序对,
以此类推。
实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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次操作操作的下标、以及对象和中间过程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!