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

1.压缩算法(栈模拟)

题意

链接:https://www.nowcoder.com/questionTerminal/c27561e5b7e0441493adb9a54071888d

来源:牛客网

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

输入描述:

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

S的长度<=1000;

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

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

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

输出描述:

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

示例1

输入

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

输出

HGBCACABCACABCACAF

说明

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

思路

栈模拟。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. stack<char> st;
  5. string s;
  6. cin>>s;
  7. int n=s.length();
  8. for(int i=0;i<n;i++){
  9. if(s[i]!=']'){
  10. st.push(s[i]);
  11. }else {
  12. string tmp="";
  13. while(st.top()!='|'){
  14. tmp+=st.top();
  15. st.pop();
  16. }
  17. reverse(tmp.begin(),tmp.end());
  18. string num="";
  19. st.pop();
  20. while(st.top()!='['){
  21. num+=st.top();
  22. st.pop();
  23. }
  24. st.pop();
  25. reverse(num.begin(),num.end());
  26. int x=stoi(num);
  27. string t="";
  28. while(x--){
  29. for(char c:tmp){
  30. st.push(c);
  31. }
  32. }
  33. }
  34. }
  35. string ans;
  36. while(!st.empty()){
  37. ans+=st.top();
  38. st.pop();
  39. }
  40. reverse(ans.begin(),ans.end());
  41. cout<<ans<<endl;
  42. return 0;
  43. }

2.逛街 (单调栈)

题意

链接:https://www.nowcoder.com/questionTerminal/35fac8d69f314e958a150c141894ef6a

来源:牛客网

小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

输出

3 3 5 4 4 4

说明

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

思路

单调栈。

维护从栈底到栈顶递减的栈,这么做的意义是正着遍历可以求出每个点往左边能看到的个数,倒着遍历求出每个点往右能看到的个数。比如正着遍历,因为栈里面元素是单减的,那么每个点往左看,栈里面都是大于这个点的,所以每次栈的大小就是对应的个数。最后再加上1就是答案了。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+5;
  4. int a[N],b[N];
  5. int main(){
  6. int n;
  7. scanf("%d",&n);
  8. for(int i=1;i<=n;i++){
  9. scanf("%d",&a[i]);
  10. }
  11. stack<int> st;
  12. for(int i=1;i<=n;i++){
  13. b[i]+=st.size();
  14. while(!st.empty()&&a[i]>=st.top()){
  15. st.pop();
  16. }
  17. st.push(a[i]);
  18. }
  19. while(!st.empty()) st.pop();
  20. for(int i=n;i>=1;i--){
  21. b[i]+=st.size();
  22. while(!st.empty()&&a[i]>=st.top()){
  23. st.pop();
  24. }
  25. st.push(a[i]);
  26. }
  27. for(int i=1;i<=n;i++){
  28. printf("%d ",b[i]+1);
  29. }
  30. puts("");
  31. return 0;
  32. }

3.逆序对

题意

链接:https://www.nowcoder.com/questionTerminal/8fe007e54fc04b5e82089aaa71ba3553

来源:牛客网

作为程序员的小Q,他的数列和其他人的不太一样,他有2n2^n2n个数。

老板问了小Q一共 m次,每次给出一个整数qi(1<=i<=m)q_i (1 <= i <= m)qi​(1<=i<=m), 要求小Q把这些数每2qi2^{q_i}2qi​分为一组,然后把每组进行翻转,小Q想知道每次操作后整个序列中的逆序对个数是多少呢?

例如:

对于序列1 3 4 2,逆序对有(4, 2),(3, 2),总数量为2。

翻转之后为2 4 3 1,逆序对有(2, 1),(4, 3), (4, 1), (3, 1),总数量为4。

输入描述:

第一行一个数n(0≤n≤20)n(0 \leq n \leq 20)n(0≤n≤20)

第二行2n2^n2n个数,表示初始的序列(1≤初始序列≤1091 \leq 初始序列 \leq 10^91≤初始序列≤109)

第三行一个数m(1≤m≤106)m(1 \leq m \leq 10^6)m(1≤m≤106)

第四行m个数表示qi(0≤qi≤n)q_i(0 \leq q_i \leq n)qi​(0≤qi​≤n)

输出描述:

m行每行一个数表示答案。

示例1

输入

2

2 1 4 3

4

1 2 0 2

输出

0

6

6

0

说明

初始序列2 1 4 3

2q1=22^{q_1} = 22q1​=2 ->

第一次:1 2 3 4 -> 逆序对数为0

2q2=42^{q_2} = 42q2​=4 ->

第二次:4 3 2 1 -> 逆序对数为6

2q3=12^{q_3} = 12q3​=1 ->

第三次:4 3 2 1 -> 逆序对数为6

2q4=42^{q_4} = 42q4​=4 ->

第四次:1 2 3 4 -> 逆序对数为0

思路

咕咕咕

4.假期(动态规划)

题意

链接:https://www.nowcoder.com/questionTerminal/7cd9a140387e455a972e8fea0e74be2c

来源:牛客网

由于业绩优秀,公司给小Q放了 n 天的假,身为工作狂的小Q打算在在假期中工作、锻炼或者休息。他有个奇怪的习惯:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q一天只能干一件事。给出假期中公司,健身房的营业情况,求小Q最少需要休息几天。

输入描述:

第一行一个整数 n(1≤n≤100000)n(1\leq n\leq 100000)n(1≤n≤100000) 表示放假天数

第二行 n 个数 每个数为0或1,第 i 个数表示公司在第 i 天是否营业

第三行 n 个数 每个数为0或1,第 i 个数表示健身房在第 i 天是否营业

(1为营业 0为不营业)

输出描述:

一个整数,表示小Q休息的最少天数

示例1

输入

4

1 1 0 0

0 1 1 0

输出

2

说明

小Q可以在第一天工作,第二天或第三天健身,小Q最少休息2天

思路

dp(i,0)表示在到第i天工作所能休息的最少天数,dp(i,1)表示在到第i天健身所能休息的最少天数,dp(i,2)表示在到第i天休息所能休息的最少天数。

那么

如果第i天能工作,肯定是从第i-1天不工作转移过来

如果第i天能健身,肯定是从第i-1天不健身转移过来

第i天休息,则是从第i-1天三种状态转移过来,因为没有要求不能连续休息两天。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+5;
  4. int a[N],b[N],dp[N][3];
  5. int main(){
  6. int n;
  7. scanf("%d",&n);
  8. for(int i=1;i<=n;i++){
  9. scanf("%d",&a[i]);
  10. }
  11. for(int i=1;i<=n;i++){
  12. scanf("%d",&b[i]);
  13. }
  14. memset(dp,0x3f3f3f3f,sizeof(dp));
  15. if(a[1]){
  16. dp[1][0]=0;
  17. }
  18. if(b[1]){
  19. dp[1][1]=0;
  20. }
  21. dp[1][2]=1;
  22. for(int i=2;i<=n;i++){
  23. if(a[i]){
  24. dp[i][0]=min(dp[i-1][1],dp[i-1][2]);
  25. }
  26. if(b[i]){
  27. dp[i][1]=min(dp[i-1][0],dp[i-1][2]);
  28. }
  29. dp[i][2]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
  30. }
  31. printf("%d\n",min(dp[n][0],min(dp[n][1],dp[n][2])));
  32. return 0;
  33. }

5.视野争夺 (贪心)

题意

链接:https://www.nowcoder.com/questionTerminal/61e1e66e39f348cdb6495de91ac36a41

来源:牛客网

小Q在进行一场竞技游戏,这场游戏的胜负关键就在于能否能争夺一条长度为L的河道,即可以看作是[0,L]的一条数轴。

这款竞技游戏当中有n个可以提供视野的道具−真视守卫,第i个真视守卫能够覆盖区间[xi,yi]。现在小Q想知道至少用几个真视守卫就可以覆盖整段河道。

输入描述:

输入包括n+1行。

第一行包括两个正整数n和L(1<=n<=105,1<=L<=109)

接下来的n行,每行两个正整数xi,yi(0<=xi<=yi<=109),表示第i个真视守卫覆盖的区间。

输出描述:

一个整数,表示最少需要的真视守卫数量, 如果无解, 输出-1。

示例1

输入

4 6

3 6

2 4

0 2

4 7

输出

3

思路

按左端点从小到大,右端点从大到小排序,每次看一个区间能里的点往右最大能延伸到哪(mx),下次更新上限(up)的时候就用这个mx。这个过程和leetcode跳跃游戏那题很像。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. int l,r;
  5. bool operator<(node b){
  6. if(l==b.l){
  7. return r>b.r;
  8. }
  9. return l<b.l;
  10. }
  11. }g[100005];
  12. int main(){
  13. int n,L;
  14. scanf("%d%d",&n,&L);
  15. for(int i=0;i<n;i++){
  16. scanf("%d%d",&g[i].l,&g[i].r);
  17. }
  18. sort(g,g+n);
  19. int up=g[0].r,mx=g[0].r,cnt=1;
  20. if(g[0].l>0) {
  21. printf("-1\n");
  22. return 0;
  23. }
  24. for(int i=1;i<n;i++){
  25. if(g[i].l<=up){
  26. mx=max(g[i].r,mx);
  27. if(mx>=L){
  28. printf("%d\n",cnt+1);
  29. return 0;
  30. }
  31. }else {
  32. cnt++;
  33. up=max(up,mx);
  34. i--;
  35. }
  36. }
  37. if(mx<L){
  38. printf("-1\n");
  39. return 0;
  40. }
  41. printf("%d\n",cnt);
  42. return 0;
  43. }

总结

腾讯的笔试题做起来还是有点难度的,考察点也比较全(贪心、dp、数据结构),题目也很有价值,值得反复做。

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

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

    第一题 Q: 小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串 ...

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

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

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

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

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

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

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

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

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

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

  7. [Hihocoder 1289] 403 Forbidden (微软2016校园招聘4月在线笔试)

    传送门 #1289 : 403 Forbidden 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi runs a web server. Someti ...

  8. 2018春季校园招聘笔经面经合集:Java开发岗

    2018春季校园招聘笔经面经合集:Java开发岗 以下为精选面经: 美团外卖配送部后台开发面经 nowcoder.com/discuss/76 春招总结,干货满满 nowcoder.com/discu ...

  9. Scrapy项目 - 数据简析 - 实现腾讯网站社会招聘信息爬取的爬虫设计

    一.数据分析截图 本例实验,使用Weka 3.7对腾讯招聘官网中网页上所罗列的招聘信息,如:其中的职位名称.链接.职位类别.人数.地点和发布时间等信息进行数据分析,详见如下图:   图1-1 Weka ...

随机推荐

  1. Linux测试环境简单使用教程

    0. 本blog 简单说明一下 Linux测试环境尤其是 CentOS测试环境的开发测试使用, 教程可能不会很长, 主要是入门. 0.1 Linux简介: Linux 的历史基本上不用阐述, linu ...

  2. 云原生 - Istio可观察性之分布式跟踪(三)

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

  3. Linux 常用工具openssh之ssh-add

    前言 ssh-add命令是把专用密钥添加到ssh-agent的高速缓存中,从而提高ssh的认证速度 语法 ssh-add [-cDdLlXx] [-t life] [file ...] 选项 -D:删 ...

  4. RabbitMq 深入了解

    积少成多 ----  仅以此致敬和我一样在慢慢前进的人儿 问题一:什么是RabbitMq 下面就是些个人的感受, rabbitmq 就是一个遵循AMQP协议(这个是啥不清楚) 的消息队列的实现,用于服 ...

  5. 透过现象看webpack处理css文件中图片路径转换的具体过程

    webpack是目前使用比较流行的一个前端模块打包器,前端的任何资源都被当成一个模块来处理,如图片.css文件等等.在基于webpack构建的前端项目中,一般都会配置有关css文件处理的规则,这其中也 ...

  6. C语言创建文件夹

    问题需求:在程序中需要使用文件夹时,一般可以先在程序目录或某一路径下创建一个文件夹,然后使用该文件夹. 这种方法比较麻烦,需提前创建文件夹. 使用C语言创建文件夹的代码可以如下: #include & ...

  7. Arduino系列之光照传感器(三)

    今天,我将简单做一个当光照值低于某个值的时候,灯光自动打开,当高于某个值的时候,自动关闭. 设计代码原理: 首先,定义一个全局变量,并赋予初始值 然后,初始化程序 将设定某个IO口为输出模式 读取光度 ...

  8. IntelliJ IDEA的这个接口调试工具真是太好用了!

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  9. 初探 Node.js 框架:eggjs (环境搭配篇)

    eggjs 是一个优秀的 Node.js 框架 概述:为什么标题上说 eggjs 是一个优秀的 Node.js 框架(可跳过)? 换言之,我们为什么选择 eggjs 进行开发而不是之前初学时使用的 E ...

  10. 死磕java(7)

    http://www.cnblogs.com/liunanjava/p/4296045.html 自己写的例子 package com.sougn.trynew; public abstract cl ...