涂鸦移动面试准备

先是HR发来了两个题,然后约了电话面试,电话面试先问你的项目,详细描述一下,应该是对我的不感兴趣(我是模式识别的项目),之后“我们来一些算法题吧”我是又激动又害怕,嗯,不出所料,第一题是DP,不过是经典的(窃喜),第二题是一道经典题,总的感觉很不错,喜欢这么一个看重算法的公司,因为之前面了几个…一直跟我谈论语言胜于算法之类的事,可能那些都是专职的技术HR吧…

面试官提出的问题
问题1:
DP:一个N×N方阵,现从左上角到右下角找一条路径,只能向下或者向右走,要求路径中各数字和最大
经典题:一个整数分解为连续正整数之和
回 答:
DP:DFS递归…自己去想,太长了
经典:判断是奇数还是偶数(若是2的次方就直接返回false),若是奇数就除2找中间值,离他最近的两个数就是所求数了,偶数的话除以2,然后得到一个奇数,得到奇数就按奇数的去处理,得到两个数字,分别大的加1,小的减1,四个数就是所求结果。

解答:关于第一道题,很明显采用动态规划,可以先把矩阵输入,如果走第一行时,把每个位置的值更新为路过的值的和。如果走第一列的话,把每个位置的值更新为路过的值的和。然后从把个位置的路径的最大的值记录下来。最后可以直接得到答案
// zuoshangdaoyouxia.cpp : 定义控制台应用程序的入口点。
//

include “stdafx.h”

include

include

using namespace std;
int metrix[1024][1024];
int main()
{
int m, n;
while (cin >> m >> n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
cin >> metrix[i][j];
}
}
for (int x = 1; x < m; x++)
{
metrix[x][0] += metrix[x - 1][0];
}
for (int y = 1; y < n; y++)
{
metrix[0][y] += metrix[0][y - 1];
}
for (int a = 1; a < m; a++)
{
for (int b = 1; b < n; b++)
{
metrix[a][b] += max(metrix[a - 1][b], metrix[a][b - 1]);
}
}
cout << metrix[m - 1][n - 1];
}
return 0;
}

关于第二道题:他上面的说法是很简单,但是只能求出来单个解,如果求多个值得话就不行了。

如15可以分解为:

15 = 1 + 2 + 3 + 4 + 5

15 = 4 + 5 + 6

15 = 7 + 8

这道题很明显可以用穷举的方法求出。输入数num,设置起始位置i,再遍历连续正整数的长度k,由公式计算出 sum = i + (i+1) + … + (i+k) = (k+1) * (2*i + k) / 2,判断与n的关系,若相等则打印出从i到i+k这(k+1)个数;若sum>num,则break;

代码如下:

[cpp] view plain copy

include

using namespace std;

int main()
{
int num,sum=0;
cin>>num;
for(int i=1;i<=num/2;i++) //两个大于num/2的整数之和肯定大于num,故只需循环到num/2
{
for(int k=1;;k++) //k从1开始,不是从i开始
{
sum = (k+1)*(2*i+k)/2;
if(sum > num)
break;
if(sum == num)
{
for(int j=0;j

include

using namespace std;

int main()
{
int num,temp;
cin>>num;
for(int k=1;k<=num/2;k++)
{
//cout<

你可能感兴趣的:(面试经验)