算法2--输出数组中每个元素以及后面第一个比它大的二元组序列--栈的应用

去宜信面试一道面试题

输出数组中每个元素以及后面第一个比它大的元素二元组,若没有则输出-1,不必按数组顺序输出。

例如[7,2,3,8,6,9,1],

则输出(7,8),(2,3),(3,8),(8,9),(6,9),(9,-1),(1,-1).输出顺序不要求。

public class Study2 {
	
	public static void main(String[] args) {
		printArr(new int[]{7,2,3,8,6,9,1});
	}
	public static void printArr(int[] arr){
		Stack<Integer> s = new Stack<>();
		for(int i=0; i<arr.length; i++){
			if(s.isEmpty()) s.push(arr[i]);
			else{
				while(!s.isEmpty()&&s.peek()<arr[i]){
					System.out.println(s.pop() + " , " + arr[i]);
				}
				s.push(arr[i]);
			}
		}
		while(!s.isEmpty()){
			System.out.println(s.pop() + " , " + "-1");
		}	
	}
}

第一次思考觉得可能要使用排序等方法,因为要找到后面比它大的第一个数,还要考虑下标索引。后来提示了一下,原来可能用栈来实现。具体来说,遍历数组,当栈顶元素小于当前值时则出栈并且输出,一直到栈为空或者栈顶元素大于当前值。这样一来,栈中剩余元素其实是递减的,最后遍历一遍栈,全部与-1结合输出即可。若能想到用栈,就很简单了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值