更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记
该专栏题目包含两部分:
100 分值部分题目
200 分值部分题目
所有题目都会陆续更新,订阅防丢失
题目描述:
向一个空栈中依次存入正整数,
假设入栈元素 n ( 1 < = n < = 2 3 1 − 1 ) n(1<=n<=2^31-1) n(1<=n<=231−1)按顺序依次为 n x . . . n 4 、 n 3 、 n 2 、 n 1 nx...n4、n3、n2、n1 nx...n4、n3、n2、n1,
每当元素入栈时,如果 n 1 = n 2 + . . . + n y n1=n2+...+ny n1=n2+...+ny ( y y y的范围 [ 2 , x ] [2,x] [2,x], 1 < = x < = 1000 1<=x<=1000 1<=x<=1000 ),则 n 1 n y n1~ny n1 ny 全部元素出栈,重新入栈新元素 m ( m = 2 ∗ n 1 ) m(m=2*n1) m(m=2∗n1)。
如:依次向栈存入6、1、2、3,
当存入6、1、2时,栈底至栈顶依次为[6、1、2];
当存入3时,3=2+1,3、2、1全部出栈,重新入栈元素6(6=2*3),此时栈中有元素6;因为6=6,所以两个6全部出栈,存入12,最终栈中只剩一个元素12。
输入描述:
使用单个空格隔开的正整数的字符串,如"5 6 7 8", 左边的数字先入栈,
输入的正整数个数为 x , 1 < = x < = 1000 x,1<=x<=1000 x,1<=x<=1000。
输出描述:
最终栈中存留的元素值,元素值使用空格隔开,如"8 7 6 5", 栈顶数字在左边。
示例1
输入:
5 10 20 50 85 1
输出:
1 170
说明:
5+10+20+50=85, 输入85时,5、10、20、50、85全部出栈,入栈170,最终依次出栈的数字为1和170。
示例2
输入:
6 7 8 13 9
输出:
9 13 8 7 6
说明:
示例3
输入:
1 2 5 7 9 1 2 2
输出:
4 1 9 14 1
题解
使用 list 模拟栈的操作
源码 Java
java
public class StackEnter {
static List<Integer> list = new ArrayList<>();
static Input input;
static {
input = new Input("5 10 20 50 85 1");
input = new Input("6 7 8 13 9");
}
public static void main(String[] args) {
String[] split = input.nextLine().split(" ");
for (int i = 0; i < split.length; i++) {
push(Integer.parseInt(split[i]));
}
Integer pop = pop();
StringBuilder builder = new StringBuilder();
while (pop != null) {
builder.append(pop).append(" ");
pop = pop();
}
System.out.println(builder.toString().trim());
}
public static void push(Integer value){
int sum = 0;
for (int i = list.size() - 1; i >= 0; i--) {
sum += list.get(i);
if (sum == value) {
break;
} else if (sum > value) {
break;
}
}
if (sum == value) {
while (sum > 0) {
Integer pop = pop();
sum -= pop;
}
value = value * 2;
}
list.add(value);
}
public static Integer pop(){
if (list.isEmpty()){
return null;
}
return list.remove(list.size()-1);
}
}