题目要求如文章标题:
输入一行字符串,用,
分割不同入栈元素,每个元素最后一个数字(0-9)代表优先级,越大越高,越先出栈,相同优先级的元素按照入栈顺序出栈!
我们的目标:(第一行是输入,第二行是输出)
心路历程:从一开始的不屑,到后来的逐渐抓狂,最后说服自己踏实做人
好了,朋友们一起来瞧瞧吧…………
Step one 误会成了一个冒泡排序
第一个想法:以为是很简单的冒泡排序,就能搞定,坏在题目要求,相同优先级的按照入栈顺序出栈!!!
所以很快写完了 for int i=0……for int j = 0 …………,开始测试,case通过率仅有20%,咋回事!?!?,回头看看题目,应该坏在相同优先级上
Step two 以为判断相等时,不冒泡就OK了
紧接着,第二个想法:那也不要紧,大不了二者相等不调换就完了呗,再次测试case依然20%,
仔细想想,还是太年轻了!即使二者相等不调换顺序,也会因为任意二者比较前者大于后者需要调换顺序的时候,改变了数组原有的顺序(这里需要细品,不行自测一下,会秒懂)
冒泡算法就不上了,大家都懂。。。。。
Step three 终于解决
好了,光头脑风暴不行了,拿出纸来画个图吧:
思考良久,借助小三(new ArrayList<String>(input)
),解决问题,这个过程也不并顺利:
中间发现没做自循环一次,需要将目前最大优先级remove,否则会参与本次自循环以后的循环,导致重复输出;
还有外层循环看起来,会有些非传统,已写注释,需要细品;
最后的欣慰是代码看起来,还比较苗条
public static void main(String[] Args) {
// 机测第一题:输入 a2,b2,c2,A9,c3,C2,B9,C9 类似这样的一行,后面的数字代表优先级,数字越大优先级越高,要求,按照优先级从大到小出栈,相同优先级的按照入栈顺序出栈
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
String[] cells = input.split(",");
// 将数组快速装换为ArrayList
ArrayList<String> inputZHAN = new ArrayList<String>(Arrays.asList(cells));
String[] result = new String[cells.length];
int index = 0; // 作为result的索引使用
// 每次都从拿第一个元素 与 后面的元素进行优先级比较大小(因为每循环一次比较得出的最大优先级元素,都被remove了,当size==0的时候,就比较完了)
for (int i = 0; inputZHAN.size() > 0; i = 0) {
int ascED = (int) inputZHAN.get(i).charAt(inputZHAN.get(i).length() - 1);
int max = 0;
result[index] = inputZHAN.get(i);
for (int j = i + 1; j < inputZHAN.size(); j++) {
int ascING = (int) inputZHAN.get(j).charAt(inputZHAN.get(j).length() - 1);
if (ascED < ascING) {
result[index] = inputZHAN.get(j); // 存储当前优先级最大的元素
max = j; // 记住当前最大优先级元素的索引
ascED=(int) inputZHAN.get(j).charAt(inputZHAN.get(j).length() - 1); // 更换被比较元素
}
}
inputZHAN.remove(max); // 将当前获取的优先级最大的元素从ArrayList删除,不在参与后面优先级的比较了(该元素的出栈顺序已经确定了)
index++; // 去找 第 index+1 个出栈的元素
}
// 输出结果
for (int i = 0; i < result.length; i++) {
if (i == result.length - 1) {
System.out.print(result[i]);
} else {
System.out.print(result[i] + ",");
}
}
}
输出:(终于我猜中了开始,也猜中了结局,Orz…………)
***************万水千山总是情,看到这儿了,不要白嫖行不行,客官留个赞呗