题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 11 次交换。对于字符串
qiao 排序,总共需要 44 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个
//思路1:要求字典序最小,那肯定要尽量让字母从a开始挨个出现 —— a,b,c,d.....
//思路2:冒泡排序中,如果一个数组是完全倒序,则需要的交换的次数最多,尽可能选用完全倒序的数组,可以使字母数尽可能少
//思路3:完全倒序的数组,用冒泡排序一共要交换 n*(n-1)/2 次 —— (n-1) + (n-2) + ... + 3 + 2 + 1 , 等差数列求和公式
//思路4:解方程 n*(n-1)/2 = 100, 得 n ~ 14.65 ,所以字母最少为15个
//思路5: 15个字母从 a 开开始,依次是 a,b,c,d,e,f,g,h,i,j,k,l,m,n,o
//思路5:但是当 n = 15时,完全倒序的数组需要排105次,显然不符合题目100次的要求,所以要在基础上进行修改
//思路6: 15个字母完全倒序 —— o,n,m,l,k,j,i,h,g,f,e,d,c,b,a 扣除5次排序,还要字典序最小,将第六个字母 j 移至第一位即可
//最终结果:o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
public class Main {
public static void main(String[] args) {
int count = 100;//需要: 该串的字符排序,正好需要 100 次交换
int n = 0; //交换的次数
int i = 0; //字符串的长度
char name= 'a';
while (n < count){
n += i;
i++;
} //冒泡程序需要交换的次数 这里计算出来的字符长度i= 15;
i--; //根据冒泡程序交换法则,长度-1就是第一个字母到最后一个字母交换次数为14;
int k = n-count;//完全倒序的数组需要排105次,显然不符合题目100次的要求,所以要在基础上进行修改,所以用k来记数多了
int o = i-k; //因为我给的字符初始量是'a';整体又是倒过来的排列所以需要用i-k;
char score = (char) (name +i);//强制转换数字换字符
char score1 = (char)(name +o);
System.out.print(score1); //打印第六个字符提到第一位;
for (int j = 0; j <= i; j++) {
if(j != k) //判断j的位置不打印;
System.out.print(score);
score--; //字符递减
}
}
}