华为机试 - 堆栈中的剩余数字

news2024/11/23 13:41:20

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

向一个空栈中依次存入正整数,假设入栈元素 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

用例

输入5 10 20 50 85 1
输出1 170
说明5+10+20+50=85, 输入 85 时, 5、 10、 20、 50、 85 全部出栈,入栈 170,最终依次出栈的数字为 1 和 170。
输入6 7 8 13 9
输出9 13 8 7 6
说明
输入1 2 5 7 9 1 2 2
输出4 1 9 14 1
说明

题目解析

这题我们先求出,以每个输入元素为结尾子区间的和,存入dp数组中。如下图dp数组所示:

然后从第1个元素开始遍历(索引0开始),对比arr[i]和dp[i-1],此时

有三种可能:

  • arr[i] === dp[i-1]
  • arr[i] > dp[i-1]
  • arr[i] < dp[i-1]

其中dp[i-1]代表arr数组0~i-1索引元素值的总和。

如果arr[i] > dp[i-1],说明arr数组0~i-1的元素即使全算上,不够arr[i]打,即无法合并。

如果arr[i] === dp[i-1],arr[i]可以和前面0~i-1个数组元素合并。此时我们可以将arr[i]更改为dp[i]的值,即2 * dp[i-1] 或者 2 * arr[i],然后将arr数组的0~i-1索引删除,如下面例子所示

如果arr[i] < dp[i-1],则说明 arr数组 在 0~i-1 中存在子区间的和  可能 等于 arr[i]。

而这个子区间的右边界又必须为i-1,因此我们只能不断退出0~i-1的头部,第一次退出arr[0],然后算arr的1~i-1区间和是否等于arr[i],若不相等,则继续退出头部arr[1],然后算arr的2~i-1的区间和是否等于arr[i],若不相等,处理同上

 若相等,则我们需要将arr[i]的值替换为 2~i-1的区间和 * 2,然后删除arr数组的 2~i-1 子序列。

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", (line) => {
  const arr = line.split(" ").map(Number);

  console.log(getRemain(arr));
});

function getRemain(arr) {
  const dp = [arr[0]];

  for (let i = 1; i < arr.length; i++) {
    dp[i] = arr[i] + dp[i - 1];
  }

  for (let i = 1; i < arr.length; i++) {
    if (arr[i] === dp[i - 1]) {
      arr[i] = dp[i];
      arr.splice(0, i);
      dp.splice(0, i);
      i = 0;
      continue;
    }

    if (arr[i] < dp[i - 1]) {
      let right = i - 1;
      let left = i - 1;

      while (left >= 1) {
        let subSum = dp[right] - dp[left - 1];

        if (subSum > arr[i]) break;
        if (subSum === arr[i]) {
          arr[i] *= 2;
          arr.splice(left, right - left + 1);
          dp.splice(left, right - left + 1);
          i = left;
          break;
        }
        left--;
      }
    }
  }

  return arr.reverse().join(" ");
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows平台上安装MySql 5.6 /8.0等的各种问题解决办法汇总

又是几个月过去了,我依然没有更新博客,深深的内疚缠绕着我,我对不起关注我的各位朋友们,从现在开始,我又回来了,正确能频繁的给大家带来新的知识点或小技巧。 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创…

一本书读懂大数据 读书笔记(1)

集。谷歌的MapReduce和GoogleFileSystem(GFS)发布了之后&#xff0c;大数据的定义中除了 涵盖大量数据之外&#xff0c;还包括数据处理的速度。 网络搜索索引&#xff0c;批量处理和分析大量数据集&#xff0c;数据处理的速度 研究机构Gartner曾给大数据&#xff08;Big data…

照片一键换天空怎么弄?不妨试试这三个照片一键换天空方法

小伙伴们有没有遇到过这样的情况&#xff0c;好不容易遇到假期&#xff0c;约了朋友一起外出游玩&#xff0c;想要拍一些好看的照片&#xff0c;奈何天空阴沉沉的&#xff0c;导致拍出的照片不太理想&#xff0c;又不想放弃这个难得的假期&#xff0c;有没有什么方法可以换照片…

数据包取证分析笔记

地址扫描 地址扫描探测是指利用ARP、ICMP请求目标网段&#xff0c;如果目标网段没有过滤规则&#xff0c;则可以通过回应消息获取目标网段中存活机器的IP地址和MAC地址&#xff0c;进而掌握拓扑结构。 端口扫描 全连接扫描 TCP扫描 全连接扫描调用操作系统提供的connect()函…

Sentinel源码剖析之常用限流算法原理实现

1、限流算法简介 限流顾名思义&#xff0c;就是对请求或并发数进行限制&#xff1b;通过对一个时间窗口内的请求量进行限制来保障系统的正常运行。如果我们的服务资源有限、处理能力有限&#xff0c;就需要对调用我们服务的上游请求进行限制&#xff0c;以防止自身服务由于资源…

Profinet现场总线耦合器模拟量扩展IO

1.1概述 该系列 I/O 模块是分布式 I/O 系统中的必备组件&#xff0c;需要与合适的耦合器&#xff08;例如 BL200 系 列&#xff09;组合才能将现场设备或过程连接起来&#xff0c;实现对现场数据采集、监视和控制。 该系统需要使用电源模块提供 24VDC 系统电压和 24VDC 现场…

递归经典例题 --- 汉诺塔(图文详解)

目录 一、介绍 二、游戏规则 三、玩法简介 四、算法分析 五、代码解析 六、源码 七、递归过程详解 一、介绍 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱…

为什么面试官狂问八股文?我已经被三家公司问到哑口无言……

秋招刚过去&#xff0c;整体的感受是&#xff1a;面试难度和拿 offer 的难度比往年难多了&#xff0c;而且互联网还有较大的裁员风险&#xff0c;网上各种消息不断&#xff0c;有时候真是焦虑到不行。 大家还是要早做准备&#xff0c;多面试积累经验&#xff0c;有些人总想准备…

蓝牙技术|蓝牙标准将迈向 6GHz 频段,蓝牙技术迈向新台阶

蓝牙特别兴趣小组&#xff08;SIG&#xff09;今天宣布了新的规范开发项目&#xff0c;以定义蓝牙低功耗&#xff08;LE&#xff09;在额外的非授权中频段的操作&#xff0c;包括 6GHz 的频段。蓝牙技术是世界上部署最广泛的无线标准&#xff0c;每年有超过 50 亿件产品出货。其…

实验五可编程并行接口8255

目录一、实验目的二、实验内容三、实验报告四、运行结果一、实验目的 通过实验&#xff0c;掌握8255工作方式的设定及并行口输入输出的方法。 二、实验内容 电路连接&#xff1a; C口&#xff08;PC0~PC7&#xff09;⟺⟺逻辑电平开关&#xff08;K0~K7&#xff09; PC0⟺K0…

HTML5响应式网页设计——核心技能考核示例(用于2022年11月H5考核)

目录 基础Base.css引入(5分) Base.css编码 项目关键词注释&#xff1a;(5分) 网页框架&#xff1a;(30分) 框架编码&#xff1a; 文字填充&#xff1a;(20分) 文字编码&#xff1a; banner部分(10分) banner编码&#xff1a; 列表部分(20分) 列表编码&#xff1a; …

单商户商城系统功能拆解31—营销中心—幸运抽奖

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

替换NAS,这5个理由就够了

全球数据量爆炸性增长&#xff0c;企业对于大容量、易扩展、低成本的存储设备产生了强烈的需求&#xff0c;起初很多企业选择NAS&#xff0c;但随着企业使用场景多样性&#xff0c;对于存储设备上不再局限于存储&#xff0c;更强调安全和协作能力。 NAS相当于私有云部署的个人…

SAP AIF BTI750

第一章 AIF&#xff08;Application Interface Framework&#xff09;简介 AIF是什么&#xff1f;做什么用的&#xff1f; 功能简介 这样图很清楚的说明了AIF是什么&#xff0c;它是一个技术框架&#xff0c;它可以实施接口并且监控接口&#xff0c;以及解决消息处理期间出…

Java 垃圾收集器

堆内存示意图 垃圾收集算法 1.标记-清除算法 算法分为标记和清除两个阶段。标记出所有需要回收的对象&#xff0c;在标记完成后&#xff0c;统一回收。 缺点&#xff1a; 执行效率不稳定&#xff0c;若堆中有大量对象要被回收&#xff0c;这是必须进行大量标记和清除动作&a…

Push-Relabel算法相关阅读

Push-Relabel算法相关阅读1.Push-Relabel算法思想2.Push-Relabel算法原理示意图3.Push-Relabel算法具体实例4. 网络流各类算法简单总结与比较5. Push-Relabel 预流推进算法6. Push-Relabel算法(最大流)1.Push-Relabel算法思想 对于一个网络流图: 该算法直观可以这样理解&#…

java乱码问题一次性解决

在我们编码生活中&#xff0c;最常见的就是乱码&#xff0c;我也是遇到好几次&#xff0c;现在我整理一下所有乱码的解决方式&#xff0c;可治99%乱码问题 设置文件编码属性 修改当前 Web 项目 Tomcat Server 的虚拟机输出选项 -Dfile.encodingUTF-8 IntelliJ IDEA 中自定义…

AntDB入选《2022爱分析·信创厂商全景报告》

近日&#xff0c;AntDB数据库成功入选《2022爱分析信创厂商全景报告》信创数据库全景地图。报告综合考虑企业关注度、行业落地进展等因素&#xff0c;遴选出在信创市场中具备成熟解决方案和落地能力的厂商。 图1 AntDB数据库入选证书 报告指出&#xff0c;数据库作为企业存储、…

​力扣解法汇总790. 多米诺和托米诺平铺

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如…

dubbo:docker安装dubbo-admin、zookeeper

0.引言 我们在搭建dubbo框架时&#xff0c;需要安装一个dubbo-admin来管理服务已经配置文件&#xff0c;今天我们来看看如何通过docker快速搭建一个dobbo-admin 1. 安装 1、首先到dockerhub上搜索dubbo-admin的镜像源 2、可以看到两个引用较高的镜像源&#xff0c;第一个是a…