华为笔试
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数组剩下的元素为递增数组,那么就可以和