搜狗2016年校招笔试编程题记录+总结

不同的职位题目应该不一样,我遇到的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,在被时间催促且没有熟知的语言的情况下,还是慌了,果然还是太嫩了啊……


每做一次笔试确实都会有不少收获,再接再厉吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值