可以申请两个栈,一个存放数字一个存放字符。本题我们直接申请一个栈,数据类型设定为pair<int,string>。遍历原字符串时,遇到数字则计算保存到num中,遇到左括号 [ 则入栈,入栈后,将num置0,将字符串清空;遇到字符则进行拼接保存至res中,遇到右括号 ] 则出栈。在出栈时,首先得到栈顶数字n,然后得到栈顶字符串str,拼接的重复次数为栈顶数字指定的大小,拼接的方式为str=str+res。

代码如下:

class Solution {
public:string decodeString(string s) {stack<pair<int,string>>st;string res="";int num=0;for(int i=0;i<s.size();i++){if(s[i]-'0'>=0&&s[i]-'0'<=9){num*=10;num+=s[i]-'0';}else if(s[i]=='['){st.push(make_pair(num,res));num=0;res="";}else if(s[i]==']'){int n=st.top().first;string str=st.top().second;st.pop();for(int j=0;j<n;j++)str=str+res;     //字符串重复多次,多次拼接res=str;}elseres+=s[i];}return res;}
};

做完字符串解码后,看猿辅导的一道笔试题,题目的具体故事背景记不清了,大概问题是:

输入一个只包含 [ 、] 、数字(1-9)的字符串。[ ]表示一个箱子,[ ]3表示3个箱子,[ ]内部可以嵌套更多的箱子,即大箱子装小箱子。求字符串最终对应的箱子数量。

比如:[ ] [ [ ] [ ] [ ]2 ]3  表示  1+(1+1+2)*3+3=16,则最终的箱子数为16。

这道题就类似于字符串解码,当然也可以用递归的方法做(可以自己尝试,相比较于字符串解码的思想要复杂一点),分析这道题,首先我们从后向前看,对于遇到的字符,如果是数字,首先箱子总数要加上该数字num。然后若这个数字接下来对应的箱子中有嵌套箱子,则需要用该数字乘以嵌套中的箱子数量,遍历完当前的最外层箱子,接下来就是判断前面是否还有大箱子,有则加上该箱子的总数。

我们用栈来做:首先遇到数字,我们保存至num中(注意num初始化为1,因为没有数字默认为1),然后遇到 ] 时,我们将num入栈,然后将num置1,遇到 [ 则出栈,获取栈顶数字n,然后判断此时栈是否为空,不为空,则说明我们还在计算某个大箱子内嵌套的箱子总数,则temp+=n;为空则说明我们遍历完一个完整的大箱子了,此时总数res+=n*temp+n;然后将temp置0,方便接下来继续遍历计算。结合代码看就会明白计算规则。

代码如下:

#include<iostream>
#include<string>
#include<stack>
using namespace std;
int res = 0;
void track(string s)
{stack<int>st;int num = 1;int temp = 0;for (int i = s.size() - 1; i >= 0; i--){if (s[i] - '0' >= 0 && s[i] - '0' <= 9) {num = s[i] - '0';}else if (s[i] == ']') {st.push(num);num = 1;}else if (s[i] == '[') {int n = st.top();st.pop();if (st.empty()){res += n * temp + n;   //外层箱子数为n,内部装的箱子数为temptemp = 0;              //置0方便计算接下来遇到新的含嵌套的箱子}elsetemp += n;        //计算含嵌套的箱子中装了多少个箱子}}
}
int main() {string s;cin >> s;track(s);cout << res << endl;return 0;
}

字符串解码(猿辅导笔试题数箱子)相关推荐

  1. 【leetcode】第394题:字符串解码(华为笔试题)

    题目:给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. ...

  2. 90 个名企笔试题和算法题

    名企笔试 名企笔试:美团2016招聘笔试(股票交易日) 名企笔试:搜狐2016招聘笔试题(扎金花) 名企笔试:凤凰网2015招聘(二分查找) 名企笔试:4399游戏校招笔试题(快速排序) 名企笔试:蘑 ...

  3. 搬:90 个名企笔试题和算法题

    名企笔试 名企笔试:美团2016招聘笔试(股票交易日) 名企笔试:搜狐2016招聘笔试题(扎金花) 名企笔试:凤凰网2015招聘(二分查找) 名企笔试:4399游戏校招笔试题(快速排序) 名企笔试:蘑 ...

  4. 猿辅导校招技术类笔试题

    猿辅导校招技术类笔试题 2019年 大巴车 这道题还挺简单的,题干也写了,数组按块翻转,块内保持不变 import java.util.*; public class Main {public sta ...

  5. 猿辅导2019校招技术类笔试题(题目出的很好)

    1.猿辅导公司某研发小组一共有 12 名同学,其中 9 人能做后端开发,6 人能做前端开发.现在要抽调 4 名同学成立项目小组,负责公司的一项"机密"项目.其中 2 名同学做后端开 ...

  6. 猿辅导python面试题_猿辅导面试内容是什么?面试官会问什么问题?

    前排提示:B站有视频版,不想看文字的同学可以直接点链接哦- 初试:成都猿辅导-辅导老师面试经验分享_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com 岗前三天培训: ...

  7. 大厂常见笔试题 滑动窗口内数的和

    大厂常见笔试题,我以为出一个很难的题,结果出了一个基础题, 给你一个大小为n的整型数组和一个大小为k的滑动窗口,将滑动窗口从头移到尾,输出从开始到结束每一个时刻滑动窗口内的数的和. 样例 对于数组 [ ...

  8. Trilogy公司的笔试题:根据指定规则用最少的步骤将数转为1

       Trilogy公司的笔试题: 如果n为偶数,则将它除以2,如果n为奇数,则将它加1或者减1.问对于一个给定的n,怎样才能用最少的步骤将它变到1.     例如:n=11: ① ++n -> ...

  9. java字符串笔试题_五道Java常见笔试题及答案汇总

    1.String和StringBuffer的区别? 答:Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数 ...

最新文章

  1. 聊聊spring cloud gateway的GlobalFilter
  2. 整合SharePoint MOSS 和SQL Server 2005 reporting service(一)
  3. CF1592E Bored Bakry(二进制+前缀异或和)
  4. C++通过原子变量代替互斥量
  5. 金蝶k3财务接口_金蝶云为企业成长而生,让工作更高效!
  6. wampserver下配置虚拟主机 实现多站点支持
  7. 解决HuggingFace加载预训练模型时报错TypeError: expected str, bytes or os.PathLike object, not NoneType
  8. linux 添加新的系统调用,如何在Linux中添加新的系统调用
  9. arcgis图层叠加不匹配
  10. 《完美软件》读书笔记10:有关测试的主要误区
  11. Feedforward Deep Networks(要点)
  12. hibernate 里面 mysql dialect 配置
  13. LC60 Permutation Sequence
  14. 一种使用Python计算可达矩阵的简单方法
  15. 关于Ubuntu python程序利用lixb264生成h264格式的视频相关问题
  16. 天池大数据竞赛-河北高校邀请赛——二手车交易价格预测-初赛第22名
  17. 解构ODL:从代码到架构设计
  18. 2010-01-22 | 占豪收评:牛市继续还是进入熊市?
  19. AI绘画火了!一文看懂背后技术原理
  20. Resharper快捷键使用

热门文章

  1. MySQL数据库之约束
  2. ASEMI代理ST/意法STW43NM60ND原厂渠道车规级MOS管
  3. iostat命令详解指标分析
  4. 合天网安 第四周 | Check your source code
  5. 中科创达 面试题目合集(2021.8)
  6. 操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】
  7. 热门软件看点:QQ和它的对手们 收藏 转载
  8. MiL 和 SiL简单介绍
  9. [安卓逆向]android adb常用命令及使用案例
  10. Open3D RANSAC拟合空间直线