第五届字节青训营笔试后端编程练习题解

news2024/9/28 1:15:59

文章目录

    • 前言
    • T1.36进制加法(模拟)
      • 题面
      • 思路
      • 代码
    • T2.电影院选座(DFS)
      • 题面
      • 思路
      • 代码
    • T3.IP地址(DFS)
      • 题面
      • 思路
      • 代码

前言

前段时间🐏了,今天简单写了一下,不知道如何提交代码进行评测,题目比较简单,不过我也有可能写错,但是大体思路应该就是这样了,有问题可以在评论区指出,看到后我会积极改正的~

活动地址:https://juejin.cn/post/7171281973527838751

T1.36进制加法(模拟)

题面

题目链接:https://code.juejin.cn/pen/7180199398167543867

在这里插入图片描述

思路

思路比较简单,我们先用两个string来存储相加的两个字符串,然后将其转化为十进制数字,倒叙放入vector中(方便后续加法的进位),然后就是简单的进位加法了,注意的是这里进位的时候可能会让整体长度加一,于是我们先给较长的数值加一个前置0,这样就不会发生越界了

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"

const ll base = 36;

ll trans_int36(char c) {
	if(c >= '0' && c <= '9') return int(c - '0');
	else return int(c-'a' + 10);
}

char trans_char36(ll c) {
	if(c <= 9) return int('0' + c);
	else return char('a' + (c - 10));
}


void add_vector(vector<int> &a, vector<int> &b) {
	for(int i = 0,len = b.size();i < len; ++i) {
		a[i] += b[i];
		a[i + 1] += a[i] / base;
		a[i] %= base;
	}
	for(int i = b.size(),len = a.size();i < len - 1; ++i) {
		a[i + 1] += a[i] / base;
		a[i] %= base;
	}
	if(a.size() > 1 && a[a.size() - 1] == 0) a.pop_back();
}

int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	vector<int> a,b;
	string sa,sb;
	cin>>sa>>sb;
	for(int i = sa.size()-1;i >= 0; --i) {
		a.push_back(trans_int36(sa[i]));
	}
	
	for(int i = sb.size()-1;i >= 0; --i) {
		b.push_back(trans_int36(sb[i]));
	}
	
	if(a.size() < b.size()) swap(a,b);
	a.push_back(0);
	
	add_vector(a,b);
	for(int i = a.size() - 1; i >= 0; --i) {
		cout<<trans_char36(a[i]);
	}
	cout<<endl;
	
	return 0;
}
/*
input:
abbbb 1

output:
abbbc

*/

T2.电影院选座(DFS)

题面

题目链接:https://code.juejin.cn/pen/7180200444763832354

在这里插入图片描述

思路

一个很简单的图的连通问题,我们只需要找到最大的连通块就行,思路很多种,最简单的就是写一个DFS,只要找到空闲的位置,我们就从这个点开始搜索,并且在搜索的过程中记录这个连通块的大小,最后更新一下ans

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"

const int N = 1e3+10;

int n,m,cnt;
int dx[4]={1,-1,0,0},dy[4]={0,0,-1,1};
bool mp[N][N];

void dfs(int i,int j) {
	if(i < 0 || j < 0 || i >= n || j >= m) return;
	if(mp[i][j]) return;
	cnt++;
	mp[i][j] = true;
	for(int k = 0;k < 4; ++k) {
		int nx = i + dx[k];
		int ny = j + dy[k];
		dfs(nx,ny);
	}
}

int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i = 0;i < n; ++i) 
		for(int j = 0;j < m; ++j)
			cin>>mp[i][j];
	
	for(int i = 0;i < n; ++i) 
		for(int j = 0;j < m; ++j)
			cout<<mp[i][j]<<" \n"[j == m-1];
	
	int ans = 0;
	for(int i = 0;i < n; ++i) 
		for(int j = 0;j < m; ++j) {
			if(!mp[i][j]) {
				cnt = 0;
				dfs(i,j);
				ans = max(ans,cnt);
			}
		}
	cout<<ans<<endl;
	return 0;
}

/*
input:
4 7
1 0 0 1 0 0 0
1 0 0 0 0 1 1
0 0 0 1 0 0 0
1 1 0 1 1 0 0

output:
18


input:
4 7
1 0 0 1 0 0 0
1 1 1 1 0 1 1
0 0 0 1 0 0 0
1 1 0 1 1 0 0

output:
9

*/

T3.IP地址(DFS)

题面

题目链接:https://code.juejin.cn/pen/7180201853819781157

在这里插入图片描述

思路

思路比较简单,不过数据处理起来有一点麻烦

  • 首先这一串可以看作数字和非数字组成,对于非数字部分,我们需要替换成字符串中未出现的数字,并且重复的字母表示同一个数字,那么我们就处理这个非数字字母和数字的对应关系就好了,那么这个就可以用回溯搜索来匹配这个关系,我们每一层搜索就确定一个字母和一个数字的匹配,然后搜索的出口就是将所有出现的字母与数字匹配完成(当然也有可能不存在字母,那就直接进行检查环节)

  • 匹配完成后就是将对应的字母替换成数字,然后取校验这个数字是否合法,比如不能存在前导 0 0 0 ,不能大于 255 255 255 ,因为 ip 地址是一个四位的值,那么我们一一校验即可,如果满足条件,那么我们就直接输出这个结果即可

  • 然后还有个问题就是断点,其实我们就可以想象成.在字符串中放置的方法,其实就是一个三重循环即可,.是不能放在最左边和最右边的,那么其位置的范围就是第一个字符的右边到,倒数第二个字符的右边,我这里就是将i表示的含义就是将.放在第i个字符的右边,jk也是如此,那么这个问题到这里就结束了

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"

bool vis[10];
map<char,int> mp;
set<char> st;
vector<char> vec;
int vec_len;
string sa[4],sb[4];

bool check(string ss) {
	if(ss[0] == '0' && ss.size() != 1) return false;
	int kk = 0;
	for(int i = 0;i < ss.size(); ++i) {
		if(ss[i] < '0' || ss[i] > '9') return false;
		kk = kk * 10 + (ss[i] - '0');
	}
	if(kk > 255 || kk < 0) return false; 
	return true;
}

void dfs(int loci) {
	if(loci == vec_len) {
		for(int i = 0;i < 4; ++i) {
			for(int j = 0,loc_len = sa[i].size();j < loc_len; ++j) {
				if(sa[i][j] >= '0' && sa[i][j] <= '9')
					sb[i][j] = sa[i][j];
				else {
					if(mp[sa[i][j]] < 0 || mp[sa[i][j]] > 9) 
						return;
					sb[i][j] = char(mp[sa[i][j]] + '0');
				}	
			}
			if(check(sb[i]) == false) return;
		}
		string loc_ss = sb[0];
		for(int i = 1;i < 4; ++i) {
			loc_ss.append(".");
			loc_ss.append(sb[i]);
		}
		cout<<loc_ss<<endl;
		return;
	}
	for(int i = 0; i <= 9; ++i) {
		if(vis[i]) continue;
		mp[vec[loci]] = i;
		vis[i] = true;
		dfs(loci + 1);
		vis[i] = false;
		mp[vec[loci]] = -1;
	}
}

int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	string ss;
	cin>>ss;
	int len = ss.size();
	if(len < 4 || len > 12) return 0;//no answer
	for(int i = 0;i < len; ++i)
		if(ss[i] >= '0' && ss[i]<= '9')
			vis[ss[i]-'0'] = true;
		else
			st.insert(ss[i]);
	for(auto it : st) 
		vec.push_back(it);
	vec_len = vec.size();
	for(int i = 0; i < len-1; ++i) {
		for(int j = i + 1;j < len-1; ++j) {
			for(int k = j + 1 ;k < len - 1; ++k) {
				sa[0] = ss.substr(0,i + 1);
				sa[1] = ss.substr(i + 1,j - i);
				sa[2] = ss.substr(j + 1,k - j);
				sa[3] = ss.substr(k + 1,len-k-1);
				for(int l = 0;l < vec_len; ++l) 
					mp[vec[l]] = -1;
				for(int l = 0;l < 4; ++l) {
					sb[l] = sa[l];
				}
				dfs(0);
			}
		}
	}
	
	return 0;
}

/*
input1:
11a2b22a037

output1:
114.252.240.37
115.242.250.37

input2:
20212118136

output2:
20.212.118.136
202.12.118.136
202.121.18.136
202.121.181.36

*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新年新玩法,数组“招婿”:老许,你要老婆不要?

文章目录前言一、电梯“招婿”启示风波1.1、寻找“一位又高又帅的 IT 同行人员”1.2、数组“招婿”核心代码1.3、代码全是错误&#xff0c;水平不高二、Java 声明、创建、初始化数组2.1、数组声明存在的语法错误2.2、数组声明、创建、初始化的正确方式三、Java 中对于不同数据类…

尚医通-医院详情-科室接口-显示科室前端整合(二十四)

目录&#xff1a; &#xff08;1&#xff09;医院详情-功能 实现 &#xff08;2&#xff09;医院排班-需求分析 &#xff08;3&#xff09;医院排班-科室接口开发 &#xff08;4&#xff09;医院排班-显示科室前端整合 &#xff08;1&#xff09;医院详情-功能 实现 在Ho…

基于KT6368A芯片开发SOP8蓝牙自拍杆方案记录总结

一、简介给客户开发一款蓝牙自拍杆的方案芯片&#xff0c;使用KT6368A单芯片解决。两种实现逻辑1、由客户的遥控MCU来控制蓝牙芯片的开启和关闭 2、由KT6368A蓝牙芯片自己完成所有的事情&#xff0c;分两个按键&#xff0c;一个按键短按开机&#xff0c;短按关机。第二个按键实…

【SPI实验--数码管】

SPI实验--数码管一、SPI概念二、SPI硬件连接三、SPI总线通信协议四、SPI四种通信模式五、代码实现数码管一、SPI概念 1.SPI总线是Motorola首先提出的全双工三线制/四线制同步串行总线 2.采用主从模式&#xff08;Master Slave&#xff09;架构&#xff0c;支持多slave模式应用…

预测2023年Web3的9大发展趋势

Crypto 和 DeFi 在 2022 年深陷熊市&#xff0c;但 Web3 方面的需求刚刚才开始获得关注。在过去的 12 个月里&#xff0c;Web3 相关的搜索与 2021 年底的峰值相比&#xff0c;一直保持在 30% 以内&#xff0c;下一个上升趋势可能正在到来。下面我列出了目前势头正旺的 9 个 Web…

PIPE接口基本描述

信号名方向描述TxDataIN并行数据输入总线TxDataValidIN1&#xff1a;表示cycle数据有效&#xff1b;0&#xff1a;表示cycle数据无效RxDataOUT并行数据输出总线RxValidOUT1&#xff1a;表示符号锁及当RxDataValid有效时&#xff0c;数据有效 PHY MODEINPHY STATUSOUT SerDesA…

java swing电子商务系统

一、项目简介 本项目是一套基于java swing的电子商务系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;ec…

opencv案例实战——银行卡模式匹配识别

系列文章目录 1.图像读取及其通道与灰度 2.图像填充与图像融合 3.图像滤波 4.图像阈值 5.腐蚀与膨胀 6.图像梯度 7.边缘检测 8.轮廓与轮廓特征 银行卡模式匹配识别系列文章目录前言案例介绍划分模板1.思路2.获取边缘3.获取外接矩形图像预处理切割礼帽操作分割数字块sobel算子膨…

LeetCode题解 二叉树(十):654 最大二叉树;617合并二叉树

654 最大二叉树 medium 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构…

RHCEansible 编写playbook---yaml

YAML 语言特性 YAML的可读性好 YAML和脚本语言的交互性好 YAML使用实现语言的数据类型 YAML有一个一致的信息模型 YAML易于实现 YAML可以基于流来处理 YAML表达能力强&#xff0c;扩展性好YAML的三种数据结构 对象&#xff1a; 键值对的集合&#xff0c;又称为映射、哈希、字典…

Map数据结构详解

Map Object本质上是键值对的集合&#xff08;Hash结构&#xff09;&#xff0c;但Object只能将字符串当做键&#xff0c;这就给Object带来了很大的限制。 let data {} let s {name : 东方不败} data[s] 西方求败// 如果键传入非字符串的值&#xff0c;会自动为字符串 cons…

思科路由器DHCPv6服务配置

配置如下 Router>ena Router#conf t Router(config)#host R1 R1(config)#ipv6 unicast-routing R1(config)#int g0/0 R1(config-if)#ipv6 add 2001:1::1/64 R1(config-if)#no sh R1(config-if)#exit R1(config)#service dhcp R1(config)#ipv6 local pool v6pool …

CTF中的PHP特性函数(中)

前言 上篇文章给大家带来了PHP中最基本的特性&#xff0c;不知道大家学习的怎样了&#xff0c;回顾上文&#xff0c;我们讲了MD5强弱碰撞以及正则匹配的绕过&#xff0c;总体来看还是很简单的&#xff0c;下面给大家带来新的PHP特性讲解&#xff0c;会稍微比上一篇难一些。 i…

开源工作流引擎如何支撑企业级 Serverless 架构?

作者&#xff1a;董天欣&#xff08;雾雾&#xff09; Serverless 应用引擎&#xff08;SAE&#xff09;是一款底层基于 Kubernetes&#xff0c;实现了 Serverless 架构与微服务架构结合的云产品。作为一款不断迭代的云产品&#xff0c;在快速发展的过程中也遇到了许多挑战。如…

2022年统一大市场研究报告

第一章 行业概况 国内统一大市场指的是在全国范围内&#xff0c;在充分竞争以及由此形成的社会分工基础上&#xff0c;各地区市场间、各专业市场间形成了相互依存、相互补充、相互开放、相互协调的有机的市场体系。在这种市场体系下&#xff0c;商品和要素能够按照价格体系的调…

干货 | 在Docker 上搭建持续集成平台 Jenkins

Docker是一个开源的应用容器引擎&#xff0c;基于 Go 语言开发&#xff0c;Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的系统。Docker 是世界领先的软件容器平台&#xff0c;Docker 官方的口号是”调试你的应用&…

Three.js学习(二)three.js的一些基本操作

文章目录1.鼠标操作三维场景旋转、移动和缩放2.场景中添加新的三维图形3.设置材质效果4.光源效果1.鼠标操作三维场景旋转、移动和缩放 使用THREE的OrbitControls控件&#xff0c;可以实现鼠标控制三维图形的操作。主要是通过监听鼠标操作&#xff0c;控制相机的三维参数。 imp…

python数据分析-matplotlib、numpy、pandas

数据分析概述数据分析就是用适当的方法对收集来的大量数据进行分析&#xff0c;帮助人们在一处判断&#xff0c;以便采取适当行动数据分析流程jupyter notebook说明matplotlib&#xff1a;Matplotlib — Visualization with Python基本要点能将数据进行可视化&#xff0c;更直观…

docker基本命令演示

docker拉取redis镜像演示首先前往&#xff1a;https://hub.docker.com找到需要的redis镜像然后 点击之后使用命令 docker pull redis 拉取redis 成功之后使用命令 docker images 查看本地的镜像使用命令导出镜像到指定文件 docker save -o redis.tar redis:latestdocker save…

Android13适配

遇到的一些问题 1.WebChromeClient的 API onReachedMaxAppCacheSize 没了 onReachedMaxAppCacheSize overrides nothing // 扩充缓存的容量override fun onReachedMaxAppCacheSize(spaceNeeded: Long, totalUsedQuota: Long, quotaUpdater: QuotaUpdater) {quotaUpdater.upda…