转盘寿司 - 华为OD统一考试

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

寿司店周年庆,正在举办优惠活动回馈新老用户。

寿司转盘上总共有 n 盘寿司, prices[i] 是第 i 盘寿司的价格。

如果客户选择了第 i 盘寿司, 寿司店免费赠送客户距离第 i 盘寿司最近的下一盘寿司 j ,前提是 prices[j] < prices[i],如果没有满足条件的 i ,则不赠送寿司。

每个价格的寿司都可无限供应。

输入描述

输入的每一个数字代表寿司的价格,每盘寿司的价格之间使用空格分隔,例如:

3 15 6 14

表示:

  • 第 0 盘寿司价格 prices[0] 为 3
  • 第 1 盘寿司价格 prices[1] 为 15
  • 第 2 盘寿司价格 prices[2] 为 6
  • 第 3 盘寿司价格 prices[3] ​为 14
  • 寿司的盘数 n 范围为:1 ≤ n ≤ 500

每盘寿司的价格 price 范围为:1≤ price ≤1000

输出描述

输出享受优惠后的一组数据,每个值表示客户端选择第 i 盘寿司实际得到的寿司的总价格,使用空格进行分隔,例如:

3 21 9 17

示例1

输入:
3 15 6 14

输出:
3 21 9 17

题解

单调栈是一种特殊的栈数据结构,用于解决一类与找下一个更大或更小元素相关的问题。

在这个问题中,我们使用单调递减栈。

单调栈的基本思想是,维护一个栈,使得栈内的元素保持单调递减(或单调递增)。当新元素要入栈时,我们需要弹出栈内所有比该元素小的元素,以确保栈的单调性。这样,在栈中,每个元素的下一个更小(或更大)的元素就是它本身。

在这个问题中,我们用单调递减栈来维护右边第一个价格比当前寿司价格小的寿司位置。算法的步骤如下:

  1. 初始化一个空栈 st 和一个数组 gift,其中 gift[i] 表示免费赠送寿司价格,默认为 0。
  2. 从左到右遍历两倍的寿司列表,记当前索引为 idx
  3. 如果栈 st 不为空且当前寿司价格 prices[idx] 小于栈顶寿司价格 prices[st.top()],则出栈,维护免费赠送寿司价格。
  4. 将当前索引 idx 入栈。
  5. 遍历结束后,gift[i] 就是每盘寿司实际免费得到赠送寿司的价格。
  6. 然后打印输出每盘寿司实际得到的寿司的总价格即可。

Java

import java.util.*;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<Integer> prices = new ArrayList<>();
        while (scanner.hasNextInt()) {
            prices.add(scanner.nextInt());
        }
        int n = prices.size();

        // gift[i] 表示免费赠送寿司价格
        int[] gift = new int[n];
        // 大顶栈
        Deque<Integer> st = new ArrayDeque<Integer>();
        for (int i = 0; i < 2 * n; i++) {
            int idx = i % n;

            // 当前价格小于栈顶价格时则出栈, 并维护免费赠送寿司价格
            while (!st.isEmpty() && prices.get(st.peek()) > prices.get(idx)) {
                int popIdx = st.pop();
                if (gift[popIdx] == 0) {
                    gift[popIdx] = prices.get(idx);
                }
            }
            st.push(idx);
        }

        for (int i = 0; i < n; i++) {
            System.out.print((prices.get(i) + gift[i]) + " ");
        }
    }
}

Python

from collections import deque

prices = list(map(int, input().split()))
n = len(prices)

# gift[i] 表示免费赠送寿司价格
gift = [0] * n
# 大顶栈
st = deque()
for i in range(2 * n):
    idx = i % n

    # 当前价格小于栈顶价格时则出栈, 并维护免费赠送寿司价格
    while st and prices[st[-1]] > prices[idx]:
        pop_idx = st.pop()
        if gift[pop_idx] == 0:
            gift[pop_idx] = prices[idx]

    st.append(idx)

for i in range(n):
    print(prices[i] + gift[i], end=" ")

C++

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

int main() {
    vector<int> prices;
    int price;
    while(cin >> price) {
        prices.push_back(price);
    }
    int n = prices.size();

    // gift[i] 表示免费赠送寿司价格
    vector<int> gift(n, 0);
    // 大顶栈
    stack<int> st;
    for(int i = 0; i < 2 * n; i++) {
        int idx = i % n;

        // 当前价格小于栈顶价格时则出栈, 并维护免费赠送寿司价格
        while(!st.empty() && prices[st.top()] > prices[idx]) {
            int pop_idx = st.top();
            if(gift[pop_idx] == 0) {
                gift[pop_idx] = prices[idx];
            }
            st.pop();
        }
        st.push(idx);
    }

    for(int i = 0; i < n; i++) {
        cout << prices[i] + gift[i] << " ";
    }


    return 0;
}

相关练习题

题号题目难度难易度
LeetCode 907907. 子数组的最小值之和中等1976
LeetCode 768768. 最多能完成排序的块 II困难1788

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/358410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】Long-Tailed Recognition via Weight Balancing(CVPR2022)附MaxNorm的代码

目录 论文使用方法weight decayMaxNorm 如果使用原来的代码报错的可以看下面这个 论文 问题&#xff1a;真实世界中普遍存在长尾识别问题&#xff0c;朴素训练产生的模型在更高准确率方面偏向于普通类&#xff0c;导致稀有的类别准确率偏低。 key:解决LTR的关键是平衡各方面&a…

网络原理-TCP/IP(1)

应用层 我们之前编写完了基本的java socket, 要知道,我们之前所写的所有代码都在应用层中,都是为了完成某项业务,如翻译等.关于应用层,后面会有专门的讲解,在此处先讲一下基础知识. 应用层对应着应用程序,是程序员打交道最多的一层,调用系统提供的网络api写出的代码都是应用层…

如何安装配置HFS并实现无公网ip远程访问本地电脑共享文件

文章目录 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留隧道2.2 隧道名称2.3 成功使用cpolar创建二级子域名访问本地hfs 总结 前言 在大厂的云存储产品热度下降后&#xff0c;私人的NAS热度快速上升&#xff0c;其中最…

【webrtc】m98 : vs2019 直接构建webrtc及moduletest工程 2

字数有限制,我们继续 【webrtc】m98 : vs2019 直接构建webrtc及unitest工程 1modules_unittests 构建 Build started... 1>------ Build started: Project: modules_unittests, Configuration: GN Win32 ------ 1>ninja: Entering directory `G:\CDN\rtcCli\m98\src\o…

导出Mysql数据库表名和字段并合并成一个word

参考链接&#xff1a; 导出MySQL数据库所有库和字段注释及相关信息为word文档——工具类 java - Apache POI - How to copy tables from one docx to another docx - Stack Overflow 领导让我研究下一个低代码平台的代码&#xff0c;我就想着做一个把数据库字段直接导出来的…

STM32F407移植OpenHarmony笔记4

上一篇写到make menuconfig报错&#xff0c;继续开整。 make menuconfig需要/device/soc/*下面有对应的Kconfig文件。 直接去gitee下载stm32的配置文件拿来参考用。 先提取Kconfig文件&#xff0c;后面再添加其它文件。https://gitee.com/openharmony/device_soc_st/tree/Open…

【React教程】(1) React简介、React核心概念、React初始化

目录 ReactReact 介绍React 特点React 的发展历史React 与 Vue 的对比技术层面开发团队社区Native APP 开发 相关资源链接 EcmaScript 6 补充React 核心概念组件化虚拟 DOM 起步初始化及安装依赖Hello World React React 介绍 React 是一个用于构建用户界面的渐进式 JavaScrip…

day33WEB 攻防-通用漏洞文件上传中间件解析漏洞编辑器安全

目录 一&#xff0c;中间件文件解析漏洞-IIS&Apache&Nginx -IIS 6 7 文件名 目录名 -Apache 换行解析 配置不当 1、换行解析-CVE-2017-15715 2、配置不当-.htaccess 配置不当 -Nginx 文件名逻辑 解析漏洞 1、文件名逻辑-CVE-2013-4547 2、解析漏洞-nginx.conf …

LLM漫谈(四)| ChatDOC:超越ChatPDF性能并支持更多功能的阅读聊天工具

在过去的一年里&#xff0c;ChatGPT的兴起催生了许多基于GPT的人工智能工具&#xff0c;其中Chat PDF工具得到了广泛关注。这些工具对知识密集型专业人员来说尤其有价值&#xff0c;大大提高了生产力。随着Chat PDF工具的激增&#xff0c;选择正确的工具变得至关重要。 接下来&…

视频转GIF动图实践, 支持长视频转GIF

背景 找了很多GIF动图制作的工具&#xff0c;比如将视频转成GIF, 或者将一系列图片转成GIF, 增加背景文案等等功能。很多收费或者用的一些三方库有点点卡顿&#xff0c;或者需要安装一个软件&#xff0c;所以就自己做一款纯前端页面级别的 视频转 GIF 动图工具。 最开始找到一…

网站地址怎么改成HTTPS?

现在&#xff0c;所有类型的网站都需要通过 HTTPS 协议进行安全连接&#xff0c;而实现这一目标的唯一方法是使用 SSL 证书。如果您不将 HTTP 转换为 HTTPS&#xff0c;浏览器和应用程序会将您网站的连接标记为不安全。 但用户询问如何将我的网站从 HTTP 更改为 HTTPS。在此页…

米贸搜|如何“有效利用”Facebook动态广告?!

什么是动态广告&#xff1f; 在我们的日常在线购物经验中&#xff0c;我们经常遇到这样的情况&#xff1a;在某宝平台上浏览或搜索一款产品后&#xff0c;不久你就会发现&#xff0c;平台开始向你推荐与你之前浏览过的商品相似的其他商品。这种商品推荐通常非常符合你的口味&a…

用可视化表单设计轻松实现流程化办公!

在现代化职场办公中&#xff0c;低代码技术平台的利用程度越来越高&#xff0c;成为大家实现流程化办公和数字化转型的友好合作伙伴。作为专业的服务商&#xff0c;流辰信息潜心研发低代码技术平台产品及可视化表单设计工具&#xff0c;轻松助力越来越多行业的客户朋友提高办公…

C语言应用实例——贪吃蛇

&#xff08;图片由AI生成&#xff09; 0.贪吃蛇游戏背景 贪吃蛇游戏&#xff0c;最早可以追溯到1976年的“Blockade”游戏&#xff0c;是电子游戏历史上的一个经典。在这款游戏中&#xff0c;玩家操作一个不断增长的蛇&#xff0c;目标是吃掉出现在屏幕上的食物&#xff0c…

多线程事务如何回滚?

背景介绍 1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败&am…

Seata部署

1、下载seata wget https://github.com/apache/incubator-seata/releases/download/v1.4.2/seata-server-1.4.2.zip 2、执行服务端SQL -- -------------------------------- The script used when storeMode is db -------------------------------- -- the table to store Gl…

12306 真的很拉跨吗?春运是对它最大的误解!

春节降至&#xff0c;大家都抢到火车票了吗&#xff1f;马上就要迎来春节&#xff0c;是不是都在吐槽 12306 的种种不好&#xff0c;它真的有这么拉跨吗&#xff1f; 其实不然&#xff0c;每到各种节假日&#xff0c;都是对 12306 最大的误解&#xff01; 特别是春运&#xf…

多个微信号难管理?

很多客户都遇到了这几个问题&#xff1a; 1、公司分配给员工有很多个微信账号&#xff0c;但是管理起来很难&#xff1f; 2、多个微信号要不来回切换登录&#xff0c;要不需要挂在多台手机了&#xff1f; 3、每个号每天都需要发朋友圈&#xff0c;工作量大&#xff1f;有时还…

GP232RL国产USB串口如何兼容FT232RL开发资料

GP232RL是最新加入 ftdi 系列 usb 接口集成电路设备的设备。 232r是一个 usb 到串行 uart 接口&#xff0c;带有可选的时钟发生器输出&#xff0c;以及新的 ftdichip-idTM 安全加密器特性。此外&#xff0c;还提供了异步和同步位崩接口模式。 通过将外部 eeprom、时钟电路和 …

Java API 操作 HDFS

Java API 操作HDFS一般有两种方式&#xff1a; 使用HDFS客户端配置文件自动配置 Java 代码中配置 一 使用HDFS客户端配置 1.1 下载HDFS客户端配置 1.2 创建Maven项目 创建Maven项目&#xff0c;将下载的客户端配置文件 core-site.xml、hdfs-site.xml 放入resources目录下&…