题目描述
例如,对于字符串 lanlan 排序,只需要 11 次交换。对于字符串 qiaoqiao 排序,总共需要 44 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。
import java.util.Scanner; import java.util.ArrayList; import java.util.List; // 思路同其他楼一样,不过这里用代码生成字母组成的字符串 public class test { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int a = 0; //最少需要的字母数 int num2 = 0; while (true) { int count = a * (a - 1) / 2; //全乱序需要经过几次排序 if (count >= 100) { num2 = count - 100; //记录差值 break; } a++; } List<Character> list = new ArrayList<>(); //什么意思?没有< >表示创建一个对象 < >表示一个泛型 具体指存放什么类型 ArrayList既有数组特征 又有链表特征 for (int i = a - 1; i >= 0; i--) { //逆序生成各个字母 if (i == a - 1) { //第一位放差值对应的字母 list.add((char) (a - num2 - 1 + 'a')); list.add((char) (i + 'a')); //第二位开始正常生成 continue; //continue是结束if语句的执行 break是结束整个for循环 } if (i == a - 1 - num2) continue; //差值对应的字母已经放到首位,原位置位置应该空出来 list.add((char) (i + 'a')); } for (char c : list) { System.out.print(c); //打印输出 } scan.close(); } }
标签:num2,int,字母,list,蓝桥,简单,字符串,排序 From: https://www.cnblogs.com/mcpf/p/17020968.html