题目描述
向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次编号为 𝑛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();
}
}
}