第十一届蓝桥杯试题E:排序
题目
- 对一个字符串,对它进行冒泡排序使其为升序,例如:对于lan,排序成 aln 需要交换一次(只能交换相邻的两个字母),对于qiao,排序成 aioq 就需要交换4次。请找出冒泡排序时恰好需要交换100次的字符串,如果有多个字符串满足条件,则找出最短的那个,如果有多个满足条件而且还是最短的,则找出字典序最小的那个。
分析
-
举几个例子看看情况,cba可以发现c需要移动两次回到他的位置,b在a前也需要一次交换,共三次;dcba=3+2+1=6,edcba=4+3+2+1=10,我们可以从1开始按顺序累加,看看=100需要累加到多少,写一个简单的for循环测试如下。我们发现最接近100的是105,这时是从1累加到14,由此我们可以得到一个15长序列onmlkjihgfedcba,我们只需要在这个序列上通过调整减少5次就是最终答案。
-
比如edcba中e交换的次数等于后面有几个比他大的数,4个,假设我们要求的是edcba只交换8次的排列,原来总和=10,现在总和=8,我们让第三个数C提到最前面就可以实现cedba,交换次数=2+3+2+1=8,找到这个规律后就可以得出我们的最终答案105-5就是把onmlkjihgfedcba中第6个数j移到最前面,所以最终答案是:jonmlkihgfedcba
a=0
for i in range(1,15):
a+=i
print(i)
print(a)#105
验证代码
- 可以通过以下代码验证
def bubble_sort(arr):
num = 0
for i in range(len(arr)-1,0,-1):
for j in range(i):
if arr[j] > arr[j+1]:
num += 1
arr[j],arr[j+1] = arr[j+1],arr[j]
return num
print(bubble_sort(list('jonmlkihgfedcba')))#100