杨辉三角形这里就不详细介绍了,如不了解请见度娘。
题目:输入数字m、n,m,n分别表示杨辉三角形中的行和列,求杨辉三角形中第m行和第n列的值。
这是个很基础的问题,直接上代码:
#include <iostream>
using namespace std;
int main()
{
int m, n;
cin >> m >> n;
int **a = new int*[m]; //动态创建二维数组
for (int i = 0; i<m; i++)
{
a[i] = new int[m];
}
for (int i = 0; i<m;i++)
{
a[i][0] = 1;
a[i][i] = 1;
}
for (int i = 2; i<m; i++)
for (int j = 1; j<i; j++)
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
/*//此处为打印杨辉三角
for (int i = 0; i < m; i++)
{
for (int j = 0; j <= i; j++)
cout << a[i][j]<<'\t';
cout << endl;
}
*/
cout << a[m - 1][n - 1];
}
然后那个面试官问了我一下大概的思路,之后问了一个问题,即该算法的时间复杂度是多少,我紧张了一下下,说了是O(m*n),其实是O(m*m)。然后面试官就说我的专业和应聘的职位不匹配(机械工程学生一个),天哪,就这样,我就这样被刷了。
虽然被刷很可惜,但是回来还是认真反思了一下下:
1、我没有考虑m、n的关系大小,首先n必然要比m小,不然会出错。
2、m 的值的范围我没有考虑,如果m的值太大,会直接导致“堆溢出”,或者说是m的值大于int的范围,我没有考虑到。
针对m很大的情况,应该会有更加简单的算法,回来找了一下,详见:点击打开链接
这里利用到了最基础的杨辉三角定律:杨辉三角形的第n行的m个数可表示为 C(n-1,m-1)。
最开始的时候让我自我介绍,我敢接这部分我做的很差,真的准备和没准备的结果是完全不同的;然后让我介绍项目,我还是泛泛地谈了一下,只介绍了一个项目,并没有把简历上的项目全部都介绍一遍。还有一个最致命的错误是我面的软件岗,然而一般的时间再说原理和硬件,并没有怎么突出我在软件方面做了哪些工作,有什么贡献等,接着就是他问我项目上的代码写了多少行,我很诚实的说了大概1000行,不知道这样回答是不是会让面试官很不爽。建议以后面试的小伙伴应该针对自己面试的岗位,好好准备一下自我介绍和项目介绍,如果面的是软件岗,一定要突出自己在软件上的贡献。
再者就是如何面试官问道为什么非本专业的选这个岗位时一定要想好了回答,最好是一开始有所准备。功夫不负有心人,一份努力一份收货吧。秋招再战。。。