分享一下华子8月31号机考代码

仅供参考
第一题基本的字符串操作,用二维数组存放句子和单词表里的单词,注意大小写不敏感,最后遍历搜索即可;
第二题深度优先搜索算法,注意回溯的时候炸弹炸掉的墙要复原。且炸弹和陷阱只可以使用一次。
第三题动态规划,注意dp数组的含义,我设的dp[i][j]数组包含了在第i个充电桩充电和等待的时间,以及到达下一个充电桩的路途中所使用的时间。然后倒叙遍历。正序遍历应可以,不过dp数组的含义会不一样。注意边界初始化条件即可。
第一题:
#include<stdio.h>
#include<string.h>

int main(void)
{
	char str[10005]={0};
	char sentence[250][60]={0};
	char backupsentence[250][60]={0};
	scanf("%[^\n]", &str); 
	getchar();
	char word[2100][60] = { 0 };
	char str2[100001] = { 0 };
	scanf("%[^\n]", &str2);
	int len1 = strlen(str);
	int j1 = 0;
	int j2 = 0;
	int jj1 = 0;
	int jj2 = 0;
	for (int i = 0; i < len1; i++)
	{
	   if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))
	   {
		   while (!(str[i] == ' ' || str[i] == ',' || str[i] == '.') || str[i] == '"')
		   {
			   sentence[j1][j2++] = str[i];
			   backupsentence[jj1][jj2++] = str[i];
			   i++;
		   }
		   i--;
		   for (int m = 0; m < j2; m++)
		   {
			   if (sentence[j1][m] >= 'A' && sentence[j1][m] <= 'Z') { sentence[j1][m] += 32; }
		   }
		   j1++; j2 = 0;
		   jj1++; jj2 = 0;

	   }
	   if (str[i] == ' '|| str[i] == ',' || str[i] == '.')
	   {
		   sentence[j1][j2++] = str[i];
		   backupsentence[jj1][jj2++] = str[i];
		   j1++; j2 = 0;
		   jj1++; jj2 = 0;
	   }
	   if (str[i] == '"')
	   {
		   sentence[j1][j2++] = str[i];
		   backupsentence[jj1][jj2++] = str[i];
		   i++;
		   while (str[i] != '"')
		   {
			   sentence[j1][j2++] = str[i];
			   backupsentence[jj1][jj2++] = str[i];
			   i++;
		   }
		   for (int m = 1; m < j2; m++)
		   {
			   if (sentence[j1][m] >= 'A' && sentence[j1][m] <= 'Z') { sentence[j1][m] += 32; }
		   }
		   sentence[j1][j2++] = str[i];
		   backupsentence[jj1][jj2++] = str[i];
		   j1++; j2 = 0;
		   jj1++; jj2 = 0;
	   }
	   
	}//sentence输入完毕
	int list = j1;//包含标点符号,sentence中单词的数量
	/*for (int i = 0; i < list; i++)
	{
		printf("%s\n",backupsentence[i]);
	}*/
	
	int len2 = strlen(str2);
	int k1 = 0;
	int k2 = 0;
	for (int i = 0; i < len2; i++)
	{
		if ((str2[i] >= 'a' && str2[i] <= 'z') || (str2[i] >= 'A' && str2[i] <= 'Z'))
		{
			while (str2[i] != ' ')
			{
				word[k1][k2++] = str2[i];
				i++;
			}
			i--;
			for (int m = 0; m < k2; m++)
			{
			  if (word[k1][m] >= 'A' && word[k1][m] <= 'Z') { word[k1][m] += 32; }
			}
			k1++; k2 = 0;
		}
		if (str2[i] == ' ')
		{
			//word[k1][k2++] = str2[i];
			//k1++; k2 = 0;
		}
	}
	int index = k1;
	/*for (int i = 0; i < index; i++)
	{
		printf("%s\n", word[i]);
	}*/
	//printf("%d", list);
	//printf("%d\n", index);
	int replace[250] = { 0 };
	int num[250] = { 0 };
	for (int i = 0; i < list; i++)
	{
		int maxindex = 0;
		if (strcmp(sentence[i], " ") != 0 && strcmp(sentence[i], ",") != 0 && strcmp(sentence[i], ".") != 0)
		{
			for (int m = 0; m < index; m++)
			{
				if (strcmp(sentence[i], word[m]) == 0)
				{
					replace[i] = 1;
					maxindex = (maxindex > m) ? maxindex : m;
				}
				num[i] = maxindex;
			}
		}
			
	}
	for (int i = 0; i < list; i++)
	{
		if (replace[i] == 0)
		{
			printf("%s", backupsentence[i]);
		}
		else if (replace[i] == 1)
		{
			printf("%d", num[i]);
		}
	}
	return 0;
}
第二题:
#include<stdio.h>
#include<string.h>

int n, m;
int map[30][30] = { 0 };
int startx, starty;
int endx, endy;
int mintime = 999;
//int time=0;
int vis[30][30] = { 0 };
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };

void dfs(int x, int y, int time)
{
	int tx, ty;
	if (x == endx && y == endy)
	{
		mintime = (mintime > time) ? time : mintime;
		return;
	}

	for (int k = 0; k < 4; k++)
	{
		tx = x + dx[k];
		ty = y + dy[k];
		if (tx >= 0 && tx < n && ty >= 0 && ty < m && vis[tx][ty] == 0)
		{
			if (map[tx][ty] == 0||map[tx][ty]==3||map[tx][ty]==2)
			{
				vis[tx][ty] = 1;
				dfs(tx, ty, time + 1);
				vis[tx][ty] = 0;
			}
			else if (map[tx][ty] == 4)
			{
				map[tx][ty] = 0;//陷阱只可以发挥一次作用
				vis[tx][ty] = 1;
				dfs(tx, ty, time + 3);
				vis[tx][ty] = 0;
				map[tx][ty] = 4;//陷阱复原
			}
			else if (map[tx][ty] == 6)
			{
				map[tx][ty] = 0;//炸弹只可以发挥一次作用
				vis[tx][ty] = 1;
				int memx[10] = { 0 };
				int memy[10] = { 0 };
				int j1 = 0;
				for (int m = 0; m < 4; m++)
				{
					if (map[tx + dx[m]][ty + dy[m]] == 1)
					{
						memx[j1++] = tx + dx[m];
						memy[j1++] = ty + dy[m];
						map[tx + dx[m]][ty + dy[m]] = 0;
					}
				}
				dfs(tx, ty, time + 1);
				map[tx][ty] = 6;//炸弹复原
				for (int m = 0; m < j1; m++)
				{
					map[memx[m]][memy[m]] = 1;//炸毁的墙复原
				}

			}
		}

	}
	return;
}

int main(void)
{
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf("%d", &map[i][j]);
			if (map[i][j] == 2) { startx = i; starty = j; }
			if (map[i][j] == 3) { endx = i; endy = j; }
		}
	}//输入完毕
	/*startx = 0;
	starty = 0;
	endx = n - 1;
	endy = m - 1;*/
	vis[startx][starty] = 1;
	dfs(startx, starty, 0);
	//printf("%d %d\n", startx,starty);
	//printf("%d %d\n", endx, endy);
	printf("%d", mintime);
	return 0;
}

第三题:
#include<stdio.h>
#include<string.h>
//二维dp数组解法
int D;
int N;
typedef struct {
	int distance;
	int time;
}STOP;
int dp[10005][1010] = { 0 };
int dis = 0;
int main(void)
{
	scanf("%d%d", &D, &N);
	STOP stop[10005]={0};
	for (int i = 1; i<=N; i++)
	{
		scanf("%d%d", &stop[i].distance, &stop[i].time);
	}//输入完毕
	stop[N + 1].distance = D;
	stop[N + 1].time = 0;
	//printf("%d %d", stop[0].distance, stop[0].time);
	//两个特殊情况,限制两个站点之间距离小于1000
	for (int i = 0; i < N; i++)
	{
		if (stop[i + 1].distance - stop[i].distance > 1000) { printf("-1"); return 0; }
	}
	if (D - stop[N].distance > 1000) { printf("-1"); return 0; }

	//int dp[i][j]表示在到达第i个站点,剩余续航公里数j,到达下一个站点前花掉的时间
	/*if(stop[i+1].distance-stop[i].distance>j),dis=stop[i+1].distance-stop[i].distance;
	* 此时在第i个站点必须充电,dp[i][j]=dp[i+1][1000-dis]+dis/100+stop[i].time+1;
	* if(dis<=j)可以选择充电或者不充,如果充电则dp[i][j]=dp[i+1][1000-dis]+dis/100+stop[i].time+1;
	* 如果选择不充电,则dp[i][j]=dp[i+1][j-dis]+dis/100;
	//*/
	
	//初始化dp
	for (int i = 0; i <= 1000; i += 100)
	{
		int temp = 0;temp = D - stop[N].distance;
		if(i>temp){ dp[N][i] = temp / 100; }
		else
		{
			dp[N][i] = temp / 100 + stop[N].time + 1;
		}
	}
	//动态规划
	for (int i = N-1; i > 0; i--)
	{
		dis = stop[i + 1].distance - stop[i].distance;
		for (int j = 0; j <= 1000; j += 100)
		{
			if(j<dis)
			{ 
				dp[i][j] = dp[i + 1][1000 - dis] + dis / 100 + stop[i].time + 1; 
			}
			if (j >= dis)
			{
				int temp1; temp1= dp[i + 1][1000 - dis] + dis / 100 + stop[i].time + 1;
				int temp2; temp2 = dp[i + 1][j - dis] + dis / 100;
				dp[i][j] = (temp1 > temp2) ? temp2 : temp1;
			}
		}
	}
	printf("%d",dp[1][1000-stop[1].distance]+stop[1].distance/100);
	return 0;
}


#华为机考##华为笔试##华为招聘#
全部评论
{"pureText":"","imgs":[{"alt":"discuss_166****569651.jpeg","height":1623,"localSrc":"content://media/external/images/media/138082","src":"https://uploadfiles.nowcoder.com/message_images/20220905/165664256_1662345569133/discuss_1662345569651.jpeg","width":960}]}
点赞 回复 分享
发布于 2022-09-05 10:39 北京
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞 回复 分享
发布于 2022-09-05 13:35 北京
第二题dfs会不会超时呀?
点赞 回复 分享
发布于 2022-09-24 09:39 广东

相关推荐

10-17 10:05
已编辑
北华大学 全栈开发
牛客872465272号:掉头发了哥
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
评论
4
20
分享
牛客网
牛客企业服务