第十一届蓝桥杯试题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
posted @ 2024-03-02 14:16  Frommoon  阅读(12)  评论(0编辑  收藏  举报