不同的职位题目应该不一样,我遇到的2道题,其一是搜狗问答中的作弊判断,其二是矩阵计算。
1. 搜狗问答作弊判断
简单来说,就是存在作弊刷积分的情况,所以需要判断哪些人作弊,判断遵循下面2个原则:
(A) 两个人互问互答刷分,即A提的一个问题被B答了,B题的一个问题也被A答了,则这二人被判为作弊;
(B) 共同作弊刷分,即C提了一个问题,回答者有多位,其中包括已经被判为作弊的A和B,则C也被判为作弊。
嗯,大致就是这样,具体细节可能有出入。
输入类似于下面的,第一个数字为提问者id,后面的为回答者的id:
101 102
103 101 104 102
102 101
105 107 108
输出为作弊者数目和id,以上面那个输入为例:
3
101
102
103
其中101和102为互问互答作弊,而103属于共同作弊刷分。
这道题目前没有什么特别好的思路,似乎是要用到图的算法?总之先记录在这里,之后再寻找解决方案。
2. 矩阵计算
给出一个n行m列的矩阵A,定义x[i][j]为第i行和第j列中,除了A[i][j]这个位置以外的所有数的乘积(说白点就是选出第i行,抠掉第j个位置,选出第j列,抠掉第i个位置,然后把剩下的数相乘),求这个矩阵最大的x[i][j]。
输入全为非负数,第一行2个数是矩阵行数和列数,之后是矩阵本身(考题的例子忘了,于是随便写一个):
3 3
1 2 3
4 5 6
7 8 9
输出是一个数:
1008
嗯,一道很简单的题,个人思路是用2个数组pro_h[n]和pro_v[m],分别存下各行的乘积和各列的乘积,然后通过
x[i][j] = pro_h[i] * pro_v[j] / A[i][j] / A[i][j]
计算结果。在这里贴一下自己完整的c代码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n, m;
scanf("%d%d", &n, &m);
int total_num = n * m;
int *mat = (int *)malloc(total_num * sizeof(int));
/* read matrix */
int i, j;
for (i = 0; i < total_num; i++)
scanf("%d", &mat[i]);
/* calculate product for each row and each column */
long *pro_h = (long *)malloc(n * sizeof(long));
long *pro_v = (long *)malloc(m * sizeof(long));
/* n rows */
for (i = 0; i < n; i++) pro_h[i] = 1;
for (i = 0; i < n; i++)
{
int begin_index = i * m;
for (j = 0; j < m; j++)
pro_h[i] *= mat[begin_index + j];
}
/* m columns */
for (j = 0; j < m; j++) pro_v[j] = 1;
for (j = 0; j < m; j++)
{
for (i = 0; i < n; i++)
pro_v[j] *= mat[i * m + j];
}
/* calculate x[i][j] and find max value */
long max_value = 0;
for (i = 0; i < n; i++)
{
int begin_index = i * m;
for (j = 0; j < m; j++)
{
int v_ij = mat[begin_index + j];
long x_ij = pro_h[i] * pro_v[j] / v_ij / v_ij;
if (max_value < x_ij)
max_value = x_ij;
}
}
free(mat);
free(pro_h);
free(pro_v);
printf("%ld\n", max_value);
return 0;
}
思路和实现都挺简单的,但做的时候稍微有点慌,于是循环中计算数组下标时把计算写错了,用一维数组替代二维数组计算时,第(i, j)个位置的下标是
index_ij = i * m + j
然而我全部写成了
index_ij = i * n + j
所以就只有方矩阵的计算是正确的,笔试时被提示只有20%的测试通过,当时百思不得其解,考完了仔细复查才发现这问题,一失足成千古恨…
总结:
搜狗在基础编程知识题全部是c++,因而没怎么写过c++的自己做起来比较吃力,以后得补补了;
数据结构的题,比起纯理论更侧重于应用,比如给出一定情景,让你选择适用的数据结构等,还是比较有趣的,相对来说比较简单;
research的题很难,虽然之前在百度实习时搞过机器学习,觉得对大部分常用算法多多少少应该都有了解,结果还是被各种没见过的名词打脸orz;
问答题是算法复杂度分析,搜索查找相关的,觉得这方面以后也有必要看看啊orz;
编程题老实说应该不算太难,但自己一方面经历不够,一方面又过度依赖Python,在被时间催促且没有熟知的语言的情况下,还是慌了,果然还是太嫩了啊……
每做一次笔试确实都会有不少收获,再接再厉吧。