蓝桥杯Java 试题 E: 排序

大家关注微信公众号 罡罡同学 回复蓝桥杯

可免费获得历年真题和C语言版的真题源代码

Java 试题 E: 排序

【问题描述】

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。

在冒泡排序中,每次只能交换相邻的两个元素。

小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。

例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。

小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。

请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个只包含小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
原文地址
【答案】:jonmlkihgfedcba

【解析】:冒泡排序,要求字符串最短,那就假设完全逆序,设长度为n,则移动次数为 n*(n-1)/2,要求移动次数恰好大于100,则 n=15;移动次数105。要求字典序最小,则把第六个字符移动到第一个位置,前五个字符后移一位。纯逻辑推导,无代码。

思路:

首先要注意最后得到的字符串全是英文小写字母并且不重复。接下来进行分析,最后要求结果在最短的前提下字典序最小。那么我们先想办法找到最短的结果。
  最短,那是能多短就多短。最短是长度是1,但是肯定不可能,因为他还要求字符串进行了100次交换,那么长度为2可不可以呢?也不行,长度为2的字符串最多进行一次交换。
  一个长度为n的字符串,如果进行冒泡排序,假设他每次比较都进行了交换,那么它最多交换 (n-1)+(n-2)+…+1 = n*(n-1)/2 (进行n-1趟操作,第一趟操作交换n-1次,之后每趟交换的次数依次递减)。
  在n*(n-1)/2>=100的前提下,n的最小值是15。也就是说,最后结果的字符串的长度至少15(低于15,它根本连交换100次的要求都达不到)。接下来再和题目要求的字典序最小一起考虑。
  首先了解一下字典序:字典序是指从前到后比较两个字符串的大小的方法。首先比较第一个字符,如果不同则第一个字符较小的字符串更小,如果相同则继续比较第2个字符…如此继续,来比较整个字符串的大小。
  现在我们知道字符串全是英文小写字母,并且长度为15且各不相同,那么我们可以确定这15个字母就是前15个小写英文字母abcdefghijklklmno,怎么排现在还不知道。
  用逆向思维思考,若这15个字母每次冒泡两两比较都进行交换,能交换 15*(15-1) = 105次,那这个字符串只可能是这15个字母的逆序:onmlkjighfedecba。
  然后我们再想办法减少逆序字符串的5次比较,并且使最后得到的结果字典序最小,只需要把逆序字符串的第六位提前至第一位:jonmlkighfedecba。在这种情况下,字典序就是最小的,我只需要第一位比你小,我就是字典序最小的。而且第1,2,3,4,5趟,每次j会分别和o,n,m,k,l进行比较,但是不交换,这样就省下了5次交换,且最后一共交换105-5=100次。

谢谢大家的支持,您的一键三连是 罡罡同学前进的最大动力!

一键三连 一键三连 一键三连 一键三连 一键三连 一键三连

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罡罡同学

您的鼓励是罡同学最大的前进动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值