机测题目1:按照优先级从大到小出栈,相同优先级的按照入栈顺序出栈

题目要求如文章标题
  输入一行字符串,用,分割不同入栈元素,每个元素最后一个数字(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…………)
在这里插入图片描述


***************万水千山总是情,看到这儿了,不要白嫖行不行,客官留个赞呗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值