2019.8华为软件类机考题复盘

第一题。

题目

求满足如下条件的三角形个数:

1.周长为x

2.边长为整数

3.是直角三角形

数据量:x<1e5,时间1s

解析

如果直接暴力两条边,是O(n*n)的复杂度,显然无法全部通过。/

考虑上述三个条件,抽象得:

a+b+c=x

a*a+b*b=c*c

两个方程,三个未知数,所以只要确定一个变量就能算出其他两个。将方程进行处理得:

a=x(x-2b)/(2x-2b)

然后只需要枚举b,只要a为整数且a>0,且a<=b (这是为了去重)就answer++ ,不需要检查周长和直角三角形,因为公式已经包含了这两个条件。

AC代码

代码在家里,回去再贴

第二题

已知一个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

现在从矩阵中取出相邻的6个数。两者相邻的意思是两者有一条公共边(题目就是这么说的)

然后题目输入若干1*6数组,形如:

1 2 3 4 5 11  

1 2 3 4 5 6

请问,这些数是否是从矩阵中取出的数。

应该输出:

1

0

解析

好像太暴力的方法也过不了,说一下我的解决方案吧。

1.先给6个数排序,这样就容易判断一些条件。比如两两不相等。

2.根据一些特殊条件进行判断,如两两不能相等、数值不能低于1不能高于45,个位不能高于5不能低于1,十位不能高于4.等等

3.判断是否两两相邻,因为我们第二步已经去掉循环相邻,也就是有重复值的情况了,所以只需要判断他们是否能够连通。考虑并查集(考试时差点把并查集怎么写给忘了)。

AC代码

回去再贴代码

第三题

题目大意

有两个数组含义相同的数字但是顺序可能不同,每个数组内数字互不重复。现在要在数组一中删掉一部分数字(在数组二中相应删去对应的数字),要删掉尽量少的数字使两个数组完全相同。问最少删掉几个。

没做出来,主要是忘了公共子串的状态转移方程。(事实证明还是要多多复习啊)。最长公共子串(字符可以不连续的那个)

下面提示说用求两个串的最长公共子串的长度。

写写公共子串的方程吧

定义状态:

设dp[i,j]表示第一个串前i个字符和第二个串的前j个字符最长公共子串的长度。

状态转移方程:

若 s1[i] == s2[j]  有:dp[i,j]=dp[i-1,j-1]+1;

若 s1[i] != s2[j]   有:dp[i,j]=max( dp[i-1,j] , dp[i,j-1] )

初始化:

dp[0,i]=0;

dp[j,0]=0;

 

你可能感兴趣的:(ACM,面试)