试题——华为笔试总结

华为笔试

8.28晚7点参加了华为的笔试,共有3道编程题,通过做题分析,发现自己一直是个弟弟。

把记忆中的题,写出来,再分析一遍。

1、三角形题

问题描述:

给定三角形的周长l,求满足这个周长的直角三角形的数量。

解题思路:

利用双重循环遍历最短边长,和第二长边,并利用勾股定理来判断是不是直角三角形(满足直角三角形的勾股定理一定是直角三角形三边)

1、最短边(a

#include 

using namespace std;
//第一题
int zhijiao(int l)
{
	int ans=0;
	for (int i = 1; i < l / 3; i++)
	{
		for (int j = i; j <= (l - i) / 2; j++)//要= 边界才不会被遗漏
		{
			int c = l - i - j;
			if (i * i + j * j == c * c)
				ans++;
		}
	}
	return ans;
}
int main()
{
	int l = 12;
	int ans = zhijiao(l);
	cout << ans << endl;
	return 0;
}

2、在矩阵中相邻

问题描述:

输入一个或多个数组,每个数组都有6个矩阵成员元素,成员元素以空格为分隔,不同数组分行。

矩阵是5*5矩阵,判断这六个成员函数是不是相邻的成员(有一边相同),如果是输出1,如果不是输出0;

比如说输入:[1 2 3 4 5 15] ;[1 2 12 23 45 35] 输出为:[1;0]

矩阵:[  1,  2,  3,  4,  5] 

           [11,12,13,14,15]

           [21,22,23,24,25]

           [31,32,33,34,35]

           [41,42,43,44,45] ]

解题思路:

使用走迷宫的思路。走满6个就说明6个,返回ture1;其他说明不相连,就返回false 0;

走迷宫:标记矩阵mark={0};结构体(方向)4/8个方向;递归来实现迷宫回溯,(递归输入:入口“本题多了一个判断参数”;递归终止条件;for4次/8次探索,每次探索都是先判断标记,在比较判断是否找到)

#include 
#include 
#include
using namespace std;

int neighber(int i, int j, vector nums);
int* fin(int a);
int ret;
int A[5][5] = { 
	{1,2,3,4,5},	
	{11,12,13,14,15},
	{21,22,23,24,25},
	{31,32,33,34,35},
	{41,42,43,44,45} 
};
int mark[5][5] = { 0 };

bool check(vector nums)
{
	int a = 0;
	a = *(nums.begin());
	int *c= fin(a);
	//int c[2];c=fin(a) 是错的。
	int i = c[0], j = c[1];
	ret = 0;
	int res = neighber(i, j, nums);
	ret = 0;
	if (res == 6)
		return true;
	else
		return false;
}
int* fin(int a) {
	int b[2] = {0};
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			if (A[i][j] == a)
			{
				b[0] = i;
				b[1] = j;
				return b;
			}
		}
	}
	b[0] = -1;
	b[1] = -1;
	return b;
}
struct direction {
	int a, b;
};
direction d[4] = { {0,-1},{1,0},{0,1},{-1,0} };
//int ret = 0;
int neighber(int i, int j, vector nums)
{
	if (ret == 6) return  ret;
	mark[i][j] = 1;
	ret++;
	for (int k = 0; k < 4; k++)
	{
		int x = i + d[k].a;
		int y = j + d[k].b;
		if ((mark[x][y] != 1) && (x >= 0) && (y >= 0))
		{
			int l = A[x][y];
			for (auto r : nums)
			{
				if (r == l) neighber(x, y, nums);
			}
		}
	}
	return ret;
}
int main() {
	vector nums;
	vector anses;
	string num;
	//int n;
	for (int i = 0; i < 2; i++)
	{
		getline(cin, num);
		string s;
		for (auto z : num)
		{
			if (z != ' ')
				s += z;
			else
			{
				nums.push_back(stoi(s));
				s.clear();
			}
		}
		if (!s.empty())
		{
			nums.push_back(stoi(s));
			s.clear();
		}
		bool ans = check(nums);
		anses.push_back(ans);
		nums.clear();
		num.clear();
	}
	for (auto r : anses) 
		cout << r << endl;
	//vector nums = { 11,12,13,14,15,35 };
	return 0;
}

3、删除最少元素使得两个数组相同

问题描述:

输入两个整数数组A和B,两个数组中的元素都是不重复(唯一)而且无序,并且AB中的元素相同,只是顺序可能不一样,举个例子A{3,1,2,5}和B{2,1,5,3}。

现在想通过分别删除A和B中的部分元素,让A、B剩下的元素 完全相同,求A数组中需要删除的最少元素数。(B也要删除相同的元素)

解题思路

先对A数组的顺序进行存储,利用hash表来,那么B数组相对于A数组的顺序就可以得到了,这样的话只需要B数组剩下的元素为递增数组,那么就可以和

 

 

 

 

 

你可能感兴趣的:(c++编程学习)