【华为机试】2023年真题B卷(python)-堆栈中的剩余数字

一、题目

题目描述:

向一个空栈中依次存入正整数, 假设入栈元素 n(1<=n<=2^31-1)按顺序依次为 nx...n4、 n3、n2、 n1, 每当元素入栈时,如果 n1=n2+...+ny(y 的范围[2,x],1<=x<=1000),则 n1~ny 全部元素出栈,重新入栈新元素 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。
输出描述:

最终栈中存留的元素值,元素值使用空格隔开,如"8 7 6 5″, 栈顶数字在左边。 6 1 2 3

三、示例

示例 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

四、解题思路

  1. 首先,我们需要将输入的正整数字符串按空格分割成一个列表。
  2. 然后,我们可以使用一个栈来模拟入栈和出栈的过程。
  3. 对于每个入栈的元素,我们通过对栈内现有数据逐个进行逆向求和后进行判断,是否应该进行入栈操作。
  4. 如果满足出栈条件,则将栈中的元素全部出栈,并将新元素入栈。
  5. 最后,输出栈中剩余的元素,栈顶元素在左边。

五、参考代码

python 复制代码
# -*- coding: utf-8 -*-
'''
@File    :   2023-B-堆栈中的剩余数字.py
@Time    :   2023/12/16 03:18:39
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

def calculate_final_stack(nums):
    stack = []
    stack.append(nums[0])
    # len= len(nums)
    for i in range(1, len(nums)):
        sum = 0 
        for j in range(len(stack)-1,-1,-1):  # 从i-1的位置开始逆向尔和
            sum = sum + stack[j]
            if sum == nums[i]: # 如果和等于nums[i],删除旧数据,入栈2倍的nums[i],并退出此循环
                
                del stack[j:len(stack)]
                stack.append(2 * nums[i])

                break
            elif sum < nums[i]: # 如果和小于nums[i],继续循环
                if j == 0:
                    stack.append(nums[i])
                else:
                    continue
            else:  # 如果和大于nums[i],入栈nums[i]并退出此循环
                stack.append(nums[i])
                break
       
    return stack[::-1]

# 接收用户输入
nums = input()
nums = [int(i) for i in nums.split()]
result = calculate_final_stack(nums)

string_list = [str(i) for i in result]
print(" ".join(string_list))
相关推荐
en-route3 分钟前
深入理解 Scikit-learn:Python 中最常用的机器学习库
python·机器学习·scikit-learn
努力还债的学术吗喽9 分钟前
PyTorch nn.Linear 终极详解:从零理解线性层的一切(含可视化+完整代码)
人工智能·pytorch·python·深度学习·基础组件·线性层·nn.linear
蒙奇D索大38 分钟前
【数据结构】图论核心应用:关键路径算法详解——从AOE网到项目管理实战
数据结构·笔记·学习·考研·算法·图论·改行学it
学c语言的枫子38 分钟前
数据结构——Dijkstra算法
数据结构·算法
Asmalin1 小时前
【代码随想录day 29】 力扣 860.柠檬水找零
算法·leetcode·职场和发展
宸津-代码粉碎机1 小时前
Redis 进阶:跳出缓存局限!7 大核心场景的原理与工程化实践
java·人工智能·redis·python
wan5555cn1 小时前
AI视频生成技术:从想象到现实的视觉革命
人工智能·笔记·深度学习·算法·音视频
极客代码1 小时前
第五篇:后端优化——位姿图的灵魂--从图优化到滑动窗口的联合状态估计
python·深度学习·计算机视觉·视觉里程计·slam·回环检测·地图构建
程序员小白条3 小时前
度小满运维开发一面
java·运维·python·职场和发展·运维开发
小狗照亮每一天3 小时前
【菜狗学聚类】序列嵌入表示、UMAP降维——20250930
算法·分类·聚类