华为OD E卷 (200分) 01-空栈压数

题目描述


        向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次编号为 𝑛1,𝑛2,…,𝑛𝑥 ,其中 𝑛1 为最新压入的整数):

  • 如果 𝑛1=𝑛2,则 𝑛1,𝑛2 全部出栈,压入新数 𝑚=2×𝑛1 。
  • 如果 𝑛1=𝑛2+⋯+𝑛𝑦 (y 的范围为 [3, x]),即 𝑛1,𝑛2,…,𝑛𝑦  全部出栈,压入新数𝑚=2×𝑛1 。
  • 如果上述规则都不满足,则不做操作。

        向栈中输入一串数字,请输出应用此规则后栈中最终存留的数字。

输入描述


一行字符串,包含使用单个空格隔开的正整数,如“5 6 7 8”,左边的数字先入栈。
正整数大小为 [1, 2^31-1]
正整数个数为[1, 1000]

输出描述


最终栈中存留的元素值,元素值使用单个空格隔开,如“8 7 6 5”,从左至右依次为栈顶至栈底的数字。

示例

示例1

输入:
10 20 50 80 1 1

输出:
2 160

示例2

输入:
5 10 20 50 85 1

输出:
1 170

解题思路 

关键条件 

        最后压入的n个数的和等于待压入的数时,移出这n个数,并压入新数; 

思路

        创建自定义栈,实现push 方法和 print 方法;

        使用List 存储压入数据

        压入是倒序遍历计算和 是否和新压入数相等,相等则截取之前的集合作为新的入栈数据并add 新数的2倍进入list。

题解

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class T1_KongZhanYaShu {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			String[] tmp = sc.nextLine().split(" ");
			
			MyStack stack = new MyStack();
			for (int i = 0; i < tmp.length; i++) {
				stack.push(Integer.parseInt(tmp[i]));
			}
			stack.print();
		}
	}
	
	static class MyStack {
		List<Integer> list = new ArrayList<>();
		
		public void push(int num) {
			if(list.size() == 0) {
				list.add(num);
			} else {
				int sum = 0;
				int i;
				for (i = list.size()-1; i >=0 ; i--) {
					sum += list.get(i);
					if(sum == num) {
						break;
					}
				}
				if(i >= 0) {
					list = list.subList(0, i);
					push(2* num);
				} else{
					list.add(num);
				}
					
			}
		}
		
		public void print() {
			for (int i = list.size()-1; i >= 0; i--) {
				System.out.print(list.get(i) + " ");
			}
			System.out.println();
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

arnold66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值