第一题

Q:

小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?

输入描述:

输入第一行包含一个字符串s,代表压缩后的字符串。

S的长度<=1000;

S仅包含大写字母、[、]、|;

解压后的字符串长度不超过100000;

压缩递归层数不超过10层;

输出描述:

输出一个字符串,代表解压后的字符串。

输入例子1:

HG[3|B[2|CA]]F

输出例子1:

HGBCACABCACABCACAF

例子说明1:

HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGBCACABCACABCACAF

A:

用栈:

  1. int main(){
  2. string s;
  3. cin>>s;
  4. stack<char> sta;
  5. int i=0;
  6. while(i<s.size()){
  7. if(s[i]!=']'){
  8. sta.push(s[i++]);
  9. }
  10. else{//s[i]==']'
  11. string tmp="";
  12. while(sta.top()!='|'){
  13. tmp+=sta.top();
  14. sta.pop();
  15. }
  16. reverse(tmp.begin(),tmp.end());
  17. sta.pop(); //pop掉'|'
  18. string str=tmp;
  19. tmp="";
  20. while(sta.top()!='['){
  21. tmp+=sta.top();
  22. sta.pop();
  23. }
  24. reverse(tmp.begin(),tmp.end());
  25. int num=stoi(tmp);
  26. sta.pop(); //pop '['
  27. tmp="";
  28. while(num>0){
  29. tmp+=str;
  30. num--;
  31. }
  32. for(char& c:tmp){
  33. sta.push(c);
  34. }
  35. ++i;
  36. }
  37. }
  38. string res="";
  39. while(!sta.empty()){
  40. res+=sta.top();
  41. sta.pop();
  42. }
  43. reverse(res.begin(),res.end());
  44. cout<<res<<endl;
  45. return 0;
  46. }

递归:

  1. string func(const string& s,int& index){
  2. string res="";
  3. while(index<s.size() and s[index]!=']'){
  4. if(s[index]<='Z' and s[index]>='A'){
  5. res+=s[index++];
  6. }
  7. else{ //s[index]=='['
  8. index++;//指向第一个数字
  9. int tmp=s.find(index,'|');
  10. int num=stoi(s.substr(index,tmp-index));
  11. index++;//指向第一个字母
  12. string str=func(s,index);
  13. index++;
  14. while(num>0){
  15. res+=str;
  16. num--;
  17. }
  18. }
  19. }
  20. return res;
  21. }
  22. int main(){
  23. int i=0;
  24. string s="";
  25. cin>>s;
  26. cout<<func(s,i)<<endl;
  27. return 0;
  28. }

第二题

Q:

小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。

小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)

输入描述:

输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。

1<=n<=100000;

1<=wi<=100000;

输出描述:

输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。

输入例子1:

6

5 3 8 3 2 5

输出例子1:

3 3 5 4 4 4

例子说明1:

当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼。

A:

  1. #pragma warning(disable:4996)
  2. #include <iostream>
  3. #include<istream>
  4. #include <string>
  5. #include <cctype>
  6. #include<vector>
  7. #include<list>
  8. #include<cstring>
  9. #include<random>
  10. #include<typeinfo>
  11. #include<set>
  12. #include<map>
  13. #include<deque>
  14. #include<regex>
  15. #include<sstream>
  16. #include<cstdlib>
  17. #include<queue>
  18. #include<stdlib.h>
  19. #include<stdio.h>
  20. #include<stack>
  21. #include<algorithm>
  22. #include<thread>
  23. #include<mutex>
  24. #include<assert.h>
  25. #include<fstream>
  26. #include<unordered_map>
  27. #include<unordered_set>
  28. using namespace std;
  29. int main(){
  30. int N;
  31. cin>>N;
  32. vector<int> vec(N);
  33. int i=0;
  34. while(i<N and cin>>vec[i++]){;}
  35. stack<int> sta;
  36. vector<int> look_left(N,0);
  37. //向左看,不包括所在的楼
  38. for(int i=1;i<N;++i){
  39. if(sta.empty() or sta.top()>vec[i-1]){
  40. sta.push(vec[i-1]);
  41. }
  42. else{
  43. while(!sta.empty() and sta.top()<=vec[i-1]){
  44. sta.pop();
  45. }
  46. sta.push(vec[i-1]);
  47. }
  48. look_left[i]=sta.size();
  49. }
  50. //向右看,不包括所在的楼
  51. vector<int> look_right(N,0);
  52. sta=stack<int>();
  53. for(int i=N-2;i>=0;--i){
  54. if(sta.empty() or sta.top()>vec[i+1]){
  55. sta.push(vec[i+1]);
  56. }
  57. else{
  58. while(!sta.empty() and sta.top()<=vec[i+1]){
  59. sta.pop();
  60. }
  61. sta.push(vec[i+1]);
  62. }
  63. look_right[i]=sta.size();
  64. }
  65. for(int i=0;i<N;++i){
  66. cout<<1+look_left[i]+look_right[i]<<" ";
  67. }
  68. cout<<endl;
  69. }

4

  1. #pragma warning(disable:4996)
  2. #include <iostream>
  3. #include<istream>
  4. #include <string>
  5. #include <cctype>
  6. #include<vector>
  7. #include<list>
  8. #include<cstring>
  9. #include<random>
  10. #include<typeinfo>
  11. #include<set>
  12. #include<map>
  13. #include<deque>
  14. #include<regex>
  15. #include<sstream>
  16. #include<cstdlib>
  17. #include<queue>
  18. #include<stdlib.h>
  19. #include<stdio.h>
  20. #include<stack>
  21. #include<algorithm>
  22. #include<thread>
  23. #include<mutex>
  24. #include<assert.h>
  25. #include<fstream>
  26. #include<unordered_map>
  27. #include<unordered_set>
  28. #include<limits.h>
  29. using namespace std;
  30. int main(){
  31. int n;
  32. cin>>n;
  33. vector<int> company(n),gym(n);
  34. for(int i=0;i<n;++i){
  35. cin>>company[i];
  36. }
  37. for(int i=0;i<n;++i){
  38. cin>>gym[i];
  39. }
  40. vector<vector<int> >dp(n,vector<int>(3,INT_MAX));//dp[i][0]截止第i天,第i天去公司最少休息天数,dp[i][1]表示第i天去健身
  41. //dp[i][2]是截止到第i天,第i天休息的最少休息天数
  42. if(company[0]==1){
  43. dp[0][0]=0;
  44. }
  45. if(gym[0]==1){
  46. dp[0][1]=0;
  47. }
  48. dp[0][2]=1;
  49. for(int i=1;i<n;++i){
  50. if(company[i]){//上班
  51. dp[i][0]=min(dp[i-1][2],dp[i-1][1]);
  52. }
  53. if(gym[i]){//锻炼
  54. dp[i][1]=min(dp[i-1][0],dp[i-1][2]);
  55. }
  56. dp[i][2]=min(min(dp[i-1][2],dp[i-1][1]),dp[i-1][0])+1;
  57. }
  58. cout<<*min_element(dp[n-1].begin(),dp[n-1].end());
  59. }

5

  1. #pragma warning(disable:4996)
  2. #include <iostream>
  3. #include<istream>
  4. #include <string>
  5. #include <cctype>
  6. #include<vector>
  7. #include<list>
  8. #include<cstring>
  9. #include<random>
  10. #include<typeinfo>
  11. #include<set>
  12. #include<map>
  13. #include<deque>
  14. #include<regex>
  15. #include<sstream>
  16. #include<cstdlib>
  17. #include<queue>
  18. #include<stdlib.h>
  19. #include<stdio.h>
  20. #include<stack>
  21. #include<algorithm>
  22. #include<thread>
  23. #include<mutex>
  24. #include<assert.h>
  25. #include<fstream>
  26. #include<unordered_map>
  27. #include<unordered_set>
  28. #include<limits.h>
  29. using namespace std;
  30. struct range{
  31. int le;
  32. int ri;
  33. range():le(0),ri(0){}
  34. // range(int a,int b):le(a),ri(b){}
  35. bool operator<(const range& x){
  36. return le<x.le or (le==x.le and ri<x.ri);
  37. }
  38. };
  39. int main(){
  40. int n,l;
  41. cin>>n>>l;
  42. if(n<=0){
  43. cout<<-1;
  44. return 0;
  45. }
  46. vector<range> data(n);
  47. for(int i=0;i<n;++i){
  48. cin>>data[i].le>>data[i].ri;
  49. }
  50. sort(data.begin(),data.end());
  51. if(data[0].le!=0){
  52. cout<<-1;
  53. return 0;
  54. }
  55. int cur_reach=data[0].ri,cur_base=data[0].le;
  56. int i=1,cnt=1;
  57. while(data[i].le==0){
  58. cur_reach=max(cur_reach,data[i++].ri);
  59. }
  60. while(i<n and cur_reach<l){
  61. int farthest=0,base;
  62. while(i<n and data[i].le<=cur_reach){
  63. if(data[i].ri>farthest){
  64. farthest=data[i].ri;
  65. base=data[i].le;
  66. }
  67. ++i;
  68. }
  69. if(farthest<cur_reach){
  70. cout<<-1;
  71. return 0;
  72. }
  73. cur_base=base;
  74. cur_reach=farthest;
  75. cnt++;
  76. }
  77. if(cur_reach>=l){
  78. cout<<cnt;
  79. }
  80. else{
  81. cout<<-1;
  82. }
  83. return 0;
  84. }

牛客腾讯2020校园招聘-后台&综合-第一次笔试的更多相关文章

  1. 腾讯2020校园招聘-后台&综合-第一次笔试 题解

    对数据结构和算法感兴趣的可以关注一下https://github.com/MCQ1999/Datastructure_Algorithm_Solutions,分享算法题的解题思路和代码~ 1.压缩算法 ...

  2. 前端 9.16腾讯-2019校园招聘(正式卷)编程题题解(js)

    第一题 和谐的数字 牛牛很喜欢研究数字.一天,他发明了一种数字,叫做“和谐的数字”. 和谐的数字定义如下: 定义S(n)为数字n各位数字之和,如果S(n)能够整除n,那么就称n为一个“和谐的数字”. ...

  3. 牛客网-C++-2020.9.2

    1. for循环语句能够被改写成(D)语句 A. 复合 B. if C. switch D. while 解析: for循环可以写成while控制循环的次数,同时也可以被改写成do while语句 2 ...

  4. Solution -「LOCAL」「cov. 牛客多校 2020 第五场 C」Easy

    \(\mathcal{Description}\)   Link.(完全一致)   给定 \(n,m,k\),对于两个长度为 \(k\) 的满足 \(\left(\sum_{i=0}^ka_i=n\r ...

  5. Solution -「LOCAL」「cov. 牛客多校 2020 第三场 I」礼物

    \(\mathcal{Description}\)   给定排列 \(\{a_n\}\),求字典序第 \(K\) 大的合法排列 \(\{b_n\}\).称一个排列 \(\{p_n\}\) 合法,当且仅 ...

  6. 微软2016校园招聘4月在线笔试 A FontSize

    题目链接:http://hihocoder.com/problemset/problem/1288 分析:题目中所求的是最大的FontSize(记为S),其应该满足P*[W/S]*[H/S] > ...

  7. 微软2016校园招聘4月在线笔试 ABC

    题目链接:http://hihocoder.com/contest/mstest2016april1/problems 第一题:输入N,P,W,H,代表有N段文字,每段有ai个字,每行有⌊W/S⌋个字 ...

  8. hihocoder 1288 : Font Size (微软2016校园招聘4月在线笔试)

    hihocoder 1288 笔试第一道..wa了好几次,也是无语..hihocoder错了不会告诉你失败的时候的测试集,这样有时候就很烦.. 遍历所有的字体,从min(w,h)开始逐渐变小开始遍历. ...

  9. 微软2016校园招聘4月在线笔试 hihocoder 1289 403 Forbidden

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 Little Hi runs a web server. Sometimes he has to deny acces ...

随机推荐

  1. python基础(1):第一个python程序的编写

    1.第一个python编程 1.1 python的安装 1> https://www.python.org/  进入python官网,选择目标版本进行download 2> 点击setup ...

  2. PHP实现推送微信小程序模板消息

    这边只会写如何实现,至于在公众号管理后台添加模板消息可以参考这篇文章: https://www.cnblogs.com/txw1958/p/wechat-template-message.html,当 ...

  3. 我的python笔记06

    面向对象学习 本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做< ...

  4. TCP的粘包和拆包问题及解决

    前言 TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议.那么UDP是否会发生粘包或拆包的现象呢?答案是不会.UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit ...

  5. 回顾 Monty Hall (三门问题)

    一.问题描述 Monty Hall Problem 源于美国的一档电视节目<Let's Make a Deal>,其中Monty Hall 是这个节目的主持人. 节目中有三扇门1.2.3, ...

  6. C语言结构体理解

    本质就是数学中集合,里面变量相当于元素,难点在于就是:以前做数学题都是别人给了一个集合,算里面的关系,编程不一样的就是,自己定义一个集合.

  7. [CCPC2019 哈尔滨] A. Artful Paintings - 差分约束,最短路

    Description 给 \(N\) 个格子区间涂色,有两类限制条件 区间 \([L,R]\) 内至少 \(K\) 个 区间 \([L,R]\) 外至少 \(K\) 个 求最少要涂多少个格子 Sol ...

  8. (转)eclipse调试java程序的九个技巧

    转自:http://www.cnblogs.com/lingiu/p/3802391.html 九个技巧: 逻辑结构 条件debug 异常断点 单步过滤 跳到帧 Inspect expressions ...

  9. Java中的IO、NIO、File、BIO、AIO详解

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?         Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包 ...

  10. .Net中C# Dictionary 用法

    Dictionary提供快速的基于键值的元素查找. 结构是:Dictionary <[key] , [value] >,当你有很多元素的时候可以用它. 它包含在System.Collect ...