腾讯2020校园招聘(后台)算法编程题合集
bigegpt 2025-06-09 20:11 7 浏览
腾讯2020校园招聘算法题,“压缩字符串”和“逛街”
总体来说,腾讯2020年的校园招聘职位相对较多,5道题目中主要考察了学生的算法基础与正则表达式的运用。
我这边抽出了前2道题跟大家分享,第一道题和昨晚字节跳动的题目类似,都可以使用正则表达式来做。第二道题用分治的方式也非常简单
[编程题一]压缩算法
输入描述:
输入第一行包含一个字符串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
详细解答
//JAVA版本
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Main main = new Main();
String line = sc.nextLine();
StringBuilder sb = new StringBuilder(line);
main.decode(sb);
System.out.println(sb.toString());
}
private void decode(StringBuilder string){
int i=0;
int start=-1, mid=-1, end=-1;
while(i<string.length()){
if(string.charAt(i) == '[') start=i;//找到string中第一个']'的最后一个'['
if(string.charAt(i) == '|') mid=i;//找到string中第一个']'对应的'['之间的'|'
if(string.charAt(i) == ']') {end=i;break;}//遇到第一个']'就直接退出循环
i++;
}
if(start == -1) return;
int num = Integer.parseInt(string.substring(start+1, mid));//要复制的数量
String cur = string.substring(mid+1, end);//要复制的内容
StringBuilder sb = new StringBuilder();
for(int j=0; j<num; j++){
sb.append(cur);
}
string.replace(start, end+1, sb.toString());
decode(string);
}
}
//C(C++)版本
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cin >> s;
int i = 0;
while(i < s.length()){
if(s[i] == ']'){
int j =i;
int k = 0;
while(s[j] != '['){
if(s[j] == '|')
k = j;
j--;
}
int len = stoi(s.substr(j+1, k-j-1));
string s1 = s.substr(k+1, i-k-1);
string s2;
for(int si =0; si <len; si++){
s2+=s1;
}
s = s.replace(j, i-j+1, s2);
i=j;
}
i++;
}
cout << s <<endl;
}
【编程题二】逛街
输入描述:
输入第一行将包含一个数字n,代表楼的栋数,
接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。
1<=n<=100000;
<=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栋楼,那小Q一共能够看到5栋楼(2,1,3,4,6)。
当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,
加上第4栋楼,共可看到4栋楼(3,4,5,6)。
详细源码:
//JAVA 使用栈实现,非常简单
//用栈两个方向分别遍历一次,最后相加,时间复杂度为O(n);
import java.util.Stack;
import java.util.Scanner;
public class Main{
public void street(int num, int[] build){
int[] res = new int[num];
Stack<Integer> sl = new Stack<>();
//从前向后遍历,相当于每个楼往右边能看到几个
for(int i=0; i<num; i++){
res[i] += sl.size()+1; //加上自己
//维护栈,为一个楼做准备
while(!sl.isEmpty() && sl.peek()<=build[i]) sl.pop();
sl.push(build[i]); //当前楼一定能被下一个楼看见
}
Stack<Integer> sr = new Stack<>();
//从后向前遍历,相当于每个楼往左边能看到几个
for(int i=num-1; i>=0; i--){
res[i] += sr.size();
//维护栈,为一个楼做准备
while(!sr.isEmpty() && sr.peek()<=build[i]) sr.pop();
sr.push(build[i]); //当前楼一定能被下一个楼看见
}
for(int a : res) System.out.printf("%d ",a);
}
public static void main(String[] args){
Main m = new Main();
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] build = new int[num];
int i = 0;
while(sc.hasNextInt()) build[i++] = sc.nextInt();
m.street(num,build);
}
}
//Python详细注释版本,代码中保留了调试过程中的一些输出,大家代码如果读起来有困难可以跟着调试
// # -*- coding:utf-8 -*-
// 单调栈进攻!!
import sys
n = int(sys.stdin.readline().strip())
l = list(map(int, sys.stdin.readline().strip().split()))
def handle(house):
// 设置栈,储存往回看能看到的楼的高度
//设置结果,储存每栋楼往回看能看到几个
stack , res = [house[0]] , [0]*n
// 然后对这个栈
// 进行循环,每检查一栋楼都是酸这栋楼往回看能看到几栋
for i in range(1,n):
res[i] = len(stack)
//print(i,'th now res is ',res)
//只要这栋楼比stack里面的最后一个比,如果最后一个大或者等于就把stack[-1]删掉,一直比
// 直到没问题。
if stack[-1] <= house[i]:
while stack and stack[-1] <= house[i]:
//print('stack last one is ',stack[-1],' smaller than ',i,'th house')
//print("now stack pop this one ",stack[-1])
stack.pop(-1)
// print('stack is now ',stack)
stack.append(house[i])
//print('stack append new house ',house[i],' and stack is now ',stack)
continue
// 小于等于的话就直接加进去,保证单调性
//print('stack last one bigger than ',i,' th house so append')
stack.append(house[i])
//print('stack is now ',stack)
// print('res is ',res)
return res
resA = handle(l)
resB = handle(l[::-1])[::-1]
print( " ".join(list(map(str, [resA[i] + resB[i] + 1 for i in range(n)]))))
总结
腾讯的校招算法题还是相对较简单,只要认真学习了数据结构与算法的朋友应该都能轻松过关。无非是解决问题的方式优劣性。比如使用递归的时候要尽量使其不重复计算。能用递归的就尝试用动态规划试试。
至于有朋友说时间复杂度和空间复杂度的问题,我这边直接给大家科普一下这两者,方便大家以后自己计算。
下面是一段计算从1到n的3次方和。
假设:我们将计算执行一次的时间分割为一个时间单元,所有的申明不计算时间单元。
结论:图片中第一行和第四行各占1个时间单元,第三行每执行一次占用4个时间单元(两次乘法,一一次加法,一次赋值),那么执行N次所用的时间单元是4N。
第二行在初始化i算一个时间单元,判断i<=N使用N+1个时间单元和i自增N次运算隐含N时间单元,那么总共就是2N+2.
最后我们如果忽略方法的调用和返回值,那么总共消耗时间单元是6N+4;所以我们说这个方法的时间复杂度为O(N)。
其实上面的说明主要为了大家理解时间复杂度如何来的,在平时我们根本不用这样去详细计算。我们总是会去估计一个每一个模块的最大时间复杂度,然后计算。
比如For循环的时间复杂度最多是迭代次数乘以For内部的复杂度。一般是O(N),嵌套For一般是O(N平方)
好了,希望我的这个说明能帮助大家理解时间复杂度怎么来的,如果有不懂的欢迎探讨。
相关推荐
- 了解Linux目录,那你就了解了一半的Linux系统
-
大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...
- Linux命令,这些操作要注意!(linux命令?)
-
刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...
- Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!
-
在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...
- linux必学的60个命令(linux必学的20个命令)
-
以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....
- 提高工作效率的--Linux常用命令,能够决解95%以上的问题
-
点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...
- 15 个实用 Linux 命令(linux命令用法及举例)
-
Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...
- Linux 常用命令集合(linux常用命令全集)
-
系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...
- Linux的常用命令就是记不住,怎么办?
-
1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...
- Linux常用文件操作命令(linux常用文件操作命令有哪些)
-
ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...
- Linux 常用命令(linux常用命令)
-
日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E...
- 简单粗暴收藏版:Linux常用命令大汇总
-
号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...
- 「Linux」linux常用基本命令(linux常用基本命令和用法)
-
Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...
- Linux的常用命令就是记不住,怎么办?于是推出了这套教程
-
1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...
- Linux的30个常用命令汇总,运维大神必掌握技能!
-
以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...
- Linux/Unix 系统中非常常用的命令
-
Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)