2019华为实习机试题

2019华为实习机试题

又一次痛失良机,总结下来就是:
1、实力不够,硬伤啊。。。。
2、心态不好,答题的时候没掌握好节奏,紧张到思路都乱了,,,
最后一道题都写好了,可惜有个小问题没能在有限的时间里面找出来,答题结束后,一杯水还没(四声)喝完就想出来了,,,,,,,,
以下是根据回忆和答题的时候本地IDE中调试用的程序。。。详细题目见牛客网。

第一题:

大致意思是:输入一个数-回车-输入一串字符-回车,第一行表示第二行中需要处理的字符串的组数,第二行是一串字符,每9个字符为一组,每组中第一个表示该组字符串后8个字符是否需要翻转。0:翻转。1:不翻转。
测试用例:

2
0abcdefgh1abcdefgh

输出结果:

hgfedcba abcdefgh

输出要求:行末无空格//这句话被我读题的时候漏下了,浪费了点时间。。。

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

int main() {
    
    
	string str;//0abcdefgh1abcdefgh
	int groupNum = 0;
	int j = 0;
	cin >> groupNum;
	cin >> str;
	for (int i = 0; i < groupNum; i++) {
    
    
		j = i * 9;
		if (i != 0) {
    
    
			cout << " ";
		}
		if (str[j] == '1') {
    
    //big
			for (int k = j+1; k < j + 9; k++) {
    
    
				cout << str[k];
			}
		}
		else {
    
    
			for (int k = j + 8; k > j; k--) {
    
    
				cout << str[k];
			}
		}
	}

	return 0;
}

第二题

题目描述的很有趣,什么蜂蜜采蜜呀,blabla~。
输入描述:
蜂巢为原点,外面有A,B,C,D,E五片花丛,坐标都是整数。
输出描述:
从出发到返回蜂巢最短路径的长度,并取整,取整就是直接舍掉小数点后面的值。
测试输入:

200 0 200 10 200 50 200 30 200 25

输出:

456

题目中提到最长路径取整,一开始在计算的时候都用的int,可是题中不是这个意思!提交的时候报了n次错,我才发现这个坑,当时很方啊!!!也是因为这里浪费了时间,最后一道题没有弄完。。心理素质真的很重要啊!
看到题的时候觉得似曾相识,记得有一个用递归解决的问题和这个很像,可是答题的时候大脑一片空白,根本想不起来,,,最后还是用暴力搜索吧。

#include <iostream>
#include <math.h>

using namespace std;

int main() {
    
    
	int pos[6][2];
	float dis = 0, disTemp[6];
	float disOld= 214748364;
	float pathLen[6][6];
	float path[6];
	float pathShort[6];
	float passed[6];
	pos[0][0] = 0;
	pos[0][1] = 0;
	for (int i = 1; i < 6; i++) {
    
    
		cin >> pos[i][0];
		cin >> pos[i][1];
	}
	for (int i = 0; i < 6; i++) {
    
    
		for (int j = 0; j < 6; j++) {
    
    
			pathLen[i][j] = sqrt((pos[i][0] - pos[j][0])*(pos[i][0] - pos[j][0]) + (pos[i][1] - pos[j][1])*(pos[i][1] - pos[j][1]));
		}
	}
	for (int i = 0; i < 6; i++) {
    
    
		path[0] = i;
		for (int j = 0; j < 6; j++) {
    
    
				if (i != j) {
    
    
				path[1] = j;
				disTemp[0] = pathLen[i][j];
				for (int k = 0; k < 6; k++) {
    
    
					if (k != i && k != j) {
    
    
						path[2] = k;
						disTemp[1] = disTemp[0] + pathLen[j][k];
						for (int l = 0; l < 6; l++) {
    
    
							if (l != i && l != j && l != k) {
    
    
								path[3] = l;
								disTemp[2] = disTemp[1] + pathLen[k][l];

								for (int m = 0; m < 6; m++) {
    
    
									if (m != i && m != j && m != k && m != l) {
    
    
										path[4] = m;
										disTemp[3] = disTemp[2] + pathLen[l][m];
										for (int n = 0; n < 6; n++) {
    
    
											if (n != i && n != j && n != k && n != l && n != m) {
    
    
												path[5] = n;
												disTemp[4] = disTemp[3] + pathLen[m][n];
												disTemp[5] = disTemp[4] + pathLen[n][i];
											}
										}
										if (disTemp[5] < disOld) {
    
    
											disOld = disTemp[5];
											for (int len = 0; len < 6; len++) {
    
    
												pathShort[len] = path[len];
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}//200 0 200 10 200 50 200 30 200 25
	cout << (int)disOld ;
	return 0;
}

第三题

以切水果游戏为背景,嗯,,,以后不玩这个游戏了,,,
搞错了一个定义域,还是太紧张啊!!!这么简单的题,竟然耗了近一个小时,最后还是通过率0.00%,华为实习可能就无缘了,交卷后接了杯水,还没喝完,就想到了哪里不对,改了一个}的位置然后把time直接cout出来就ok了,我自己测试了一下,随便画了几个点,应该是对的,,,,

题目描述:屏幕上的网格(40x50)里有若干水果,只能用直线切水果,问最少几次能把水果切完。如图,数字一样的表示一刀
在这里插入图片描述
输入描述:
第一行输入整数N,表示水果的数量
接下来输入的数成对输入,表示水果的坐标,用空格隔开。

程序输出
切水果需要的最少的刀数。

测试输入:

2
2 2
3 4

输出:

2

思路:在这种紧张、时间又有限的情况,最可靠的办法就是(一、二、三,一起说出来吧!)暴~
先遍历每一个方格,找到水果就开始切,横竖撇捺各切一刀,找到切到水果最多的方向,切的多的方向就是这一刀的方向,然后继续找下一个水果。。。。。。。开始切!

#include <iostream>
using namespace std;
int main() {
    
    
	int mesh[40][50];
	int tempx, tempy;
	int row = 0;
	int point = 0;
	int pointTemp[4];//h,s,p,n
	int time=0;
	memset(mesh, 0, sizeof(mesh));
	memset(pointTemp, 0, sizeof(pointTemp));
	cin >> row;
	for (int i = 0; i < row; i++) {
    
    
		cin >> tempx;
		cin >> tempy;
		mesh[tempx][tempy] = 1;
		point++;
	}
	int cutDir = 0;
	for (int x = 0; x < 40; x++) {
    
    
		for (int y = 0; y < 50; y++) {
    
    //find num
			if (mesh[x][y] == 1) {
    
    //找到就切
				time++;
				mesh[x][y] = 0;
				point--;
				for (int h = 0; h < 50; h++) {
    
    //横
					if (mesh[x][h] == 1) {
    
    
						pointTemp[0]++;
					}
				}
				for (int s = 0; s < 40; s++) {
    
    //竖
					if (mesh[s][y] == 1) {
    
    
						pointTemp[1]++;
					}
				}
				for (int s = 0; s < 40; s++) {
    
    
					for (int h = 0; h < 50; h++) {
    
    
						if ((s + h) == (x + y) && mesh[s][h] == 1) {
    
    //撇
							pointTemp[2]++;
						}
					}
				}
				for (int s = 0; s < 40; s++) {
    
    
					for (int h = 0; h < 50; h++) {
    
    
						if ((40 + 50 - s + h) == (40 + 50 - x + y) && mesh[s][h] == 1) {
    
    //n捺
							pointTemp[3]++;
						}
					}
				}
				int bigTemp = pointTemp[0];
				cutDir = 0;
				for (int big = 1; big < 4; big++) {
    
    
					if (pointTemp[big] > bigTemp) {
    
    
						bigTemp = pointTemp[big];
						cutDir = big;
					}
				}
				switch (cutDir) {
    
    
				case 0:
					for (int h = 0; h < 50; h++) {
    
    //横
						if (mesh[x][h] == 1) {
    
    
							mesh[x][h] = 0;
						}
					}break;
				case 1:
					for (int s = 0; s < 40; s++) {
    
    
						if (mesh[s][y] == 1) {
    
    
							mesh[s][y] = 0;
						}
					}break;
				case 2:
					for (int s = 0; s < 40; s++) {
    
    
						for (int h = 0; h < 50; h++) {
    
    
							if ((s + h) == (x + y) && mesh[s][h] == 1) {
    
    
								mesh[s][h] = 0;
							}
						}
					}break;
				case 3:
					for (int s = 0; s < 40; s++) {
    
    
						for (int h = 0; h < 50; h++) {
    
    
							if ((40 + 50 - s + h) == (40 + 50 - x + y) && mesh[s][h] == 1) {
    
    
								mesh[s][h] = 0;
							}
						}
					}break;
				default:break;
				}
			}
		}
	}
	cout << time <<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dongdong_csdn/article/details/88856871