2021年4月4日 腾讯笔试编程题第二题
描述:
给出一个有0-9的数字组成的字符串,相邻的两个数字和为10时可以被消去。
问最后字符的长度时多少?
例如 213792,第一步可以消成2192,第二步消解为22.所以长度为2
输入:
第一行输入一个 n表示长度
第二行输入一个字符串
输出:
输出一个整数
简单的bfs即可,在储存的时候保存前后点的位置。如果原字符串两个相邻的数之和为10,则进行一次bfs消除,在这次消除的过程中记录相应的点的前置点和后置点的位置,并且判断两端是否可以继续消除。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int n,ans=0;
struct node{
int f,t,x; //f前置点的位置,t后置点的位置,x数字
}a[maxn];
string s;
void bfs(int x){
queue<pair<int,int> >q;
q.push(make_pair(x,x+1));//将相邻的点放入q中
while(!q.empty()){
int l=q.front().first;
int r=q.front().second;
q.pop();
a[l].x=0;//将值标记为0 表示已经被消过了
a[r].x=0;
a[l].t=a[r].t;//将对应的位置进行修改
a[r].f=a[l].f;
if(a[a[l].f].x==0){//若前置点的值为0,意思时前置点被消了,那么该点的前置点为前置点的前置点。
a[l].f=a[a[l].f].f;
}
if(a[a[l].f].x+a[a[r].t].x==10){ //两端的值和为10
q.push(make_pair(a[l].f,a[r].t));//压入队列
}
}
}
int main(){
cin>>n;
cin>>s;
for(int i=1;i<=n;i++){
a[i].x=(int)(s[i-1]-'0');
a[i].f=i-1;//保存位置
a[i].t=i+1;
}
for(int i=1;i<n;i++){
if(a[i].x+a[i+1].x==10){//如若相邻的点之和为10 进行bfs消除
bfs(i);
// for(int k=1;k<=n;k++){
// cout<<a[k].x<<" "<<a[k].f<<" "<<a[k].t<<endl;
// }
// cout<<endl;
}
}
for(int i=1;i<=n;i++){
ans+=(a[i].x!=0);//记录有多少个点不为0
}
cout<<ans<<endl;
}
git设置用户名密码 设置git用户名/邮箱 git config --global user.name [userna...
现在很多web项目都能用到登录界面,本文介绍一下JSP制作简单登录界面,分享给大...
Linux 常用命令集合 一 基本知识了解 1.1 目录结构 /bin 存放二进制可执行文件常...
在采用 log4j 的kafka-appender收集 spark 任务运行日志时,发现提交到 yarn 上...
Cocos2dx-C 4.x 什么是Node类 Node类详情 Node类的源文件目录 Node类的一些常用...
前提 win 系统安装植物大战僵尸这里有一个百度云网盘是从网上找的我用了应该没有...
最近你有没有遇到打印机无法使用或使用时蓝屏、崩溃的问题? 实际上,这并非偶然...
题目海滩上有一堆桃子五只猴子来分。第一只猴子把这堆桃子凭据分为五份多了一个...
本实例开发的级联下拉菜单是根据已有json数据创建的DOM元素。点击文本框后,显示...
数组是有序数据的集合。数组中的元素可以不属于同一个数据类型。用一个统一的数...