题目描述
向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次为 n 1 , n 2 , . . . n x n1,n2,... nx n1,n2,...nx,其中 n 1 n1 n1 为最新压入的整数)。
- 如果 n 1 = n 2 n1 = n2 n1=n2,则 n 1 , n 2 n1, n2 n1,n2 全部出栈,压入新数据 m ( m = 2 ∗ n 1 ) m(m =2*n1) m(m=2∗n1)
- 如果 n 1 = n 2 + . . . + n y n1 = n2 + ... + ny n1=n2+...+ny ( y y y 的范围为 [ 3 , x ] [3,x] [3,x]),则 n 1 , n 2 , … , n y n1,n2,…, ny n1,n2,…,ny 全部出栈,压入新数据 m ( m = 2 ∗ n 1 ) m(m=2*n1) m(m=2∗n1)
- 如果上述规则均不满足,则不做操作。
如:依次向栈压入6,1,2,3,
- 当压入 2 时,栈顶至栈底依次为 2,1,6;
- 当压入3时,3=2+1,3,2,1全部出栈,重新入栈整数6,此时栈顶至栈底依次为 6,6;6=6,两个6全部出栈,压入 12,最终栈中只剩个元素 12。
向栈中输入一串数字,请输出应用此规则后栈中最终存留的数字。
输入描述
一行字符串,包含使用单个空格隔开的正整数,如 “5 6 7 8”,左边的数字先入栈。
- 正整数大小为 [ 1 , 2 31 − 1 ] [1,2^{31}-1] [1,231−1]
- 正整数个数为 [ 1 , 1000 ] [1,1000] [1,1000]
输出描述
最终栈中存留的元素值,元素值使用单个空格隔开,从左至右依次为栈顶至栈底的数字
示例1
输入
10 20 50 80 1 1
输出
2 160
示例2
输入
5 10 20 50 85 1
输出
1 170
题解
利用list 模拟操作
源码Java
import java.util.ArrayList;public class EmptyStackEnter {static Input input ;static {input = new Input("10 20 50 80 1 1");}public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();String[] ss = input.nextLine().split(" ");for (int i = 0; i < ss.length; i++) {int a = Integer.parseInt(ss[i]);if (list.isEmpty()) {list.add(a);} else {int sum = 0;for (int j = list.size() - 1; j >= 0; j--) {sum += list.get(j);if (sum == a) {while (list.size()>j) {list.remove(list.size()-1);}list.add(2 * a);break;} else if (sum > a) {list.add(a);break;}}if (sum < a) {list.add(a);}}}StringBuilder builder = new StringBuilder();for (int i = list.size() - 1; i >= 0 ; i--) {builder.append(list.get(i)).append(" ");}System.out.println(builder.toString().trim());}
}