2018今日头条秋招 笔试 (2017/09/10)

20170910 头条笔试

算法岗


【改错题】

二分查找
http://blog.csdn.net/v_july_v/article/details/7093204

//首先要把握下面几个要点:
//right=n-1 => while(left <= right) => right=middle-1;
//right=n   => while(left <  right) => right=middle;
//middle的计算不能写在while循环外,否则无法得到更新。
int binary_search(int array[],int n,int value)
{
    int left=0;
    int right=n-1;
    //如果这里是int right = n 的话,那么下面有两处地方需要修改,以保证一一对应:
    //1、下面循环的条件则是while(left < right)
    //2、循环内当array[middle]>value 的时候,right = mid

    while (left<=right)         //循环条件,适时而变
    {
        int middle=left + ((right-left)>>1);  //防止溢出,移位也更高效。同时,每次循环都需要更新。

        if (array[middle]>value)
        {
            right =middle-1;   //right赋值,适时而变
        } 
        else if(array[middle]<value)
        {
            left=middle+1;
        }
        else
            return middle;  
        //可能会有读者认为刚开始时就要判断相等,但毕竟数组中不相等的情况更多
        //如果每次循环都判断一下是否相等,将耗费时间
    }
    return -1;
}

题目没有全部记得,循环体基本上按照上述思路改的。然后题目里还说了如果有多个相同元素,取最后一个,所以加了一段:

int len = data.size();//惨了惨了 不该写这句的
while(mid+1<len && data[mid+1] == target)
    mid++

题目里面有直接将vector的size方法直接赋给int类型的变量,其实这样是会引起warning的,因为size方法返回的其实是size_type类型,并不是int类型。在不同的机器上可能会出现不同结果。虽然一般都能侥幸过……

【编程题】

1、手串。

/** 请完成下面这个函数,实现题目要求的功能 **/
/** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^  **/

#include <stdio.h>  
#include <math.h>  
#include <stdlib.h>  
#include <iostream>
using namespace std;

int strand[10010][51];
int color_list[51];

int main()
{
    int n,m,c;
    scanf("%d", &n);
    scanf("%d", &m);
    scanf("%d", &c);
    //init
    for (int i=0;i<n;i++)
    {
        int len=0,color=0;
        cin>>len;
        for (int j=0;j<len;j++)
        {
            cin>>color;
            strand[i][color]=1;
        }
    }
    int ret=0;

    //do process

    for(int i=0;i<n;i++)
    {
        for(int j=1;j<51;j++)
        {
            if (strand[i][j] == 1 && color_list[j]==0)
            {
                for(int k=1;k<m;k++)
                {
                    int column = ( i+k )%n;
                    if(strand[column][j]==1)
                    {
                        ret++;
                        color_list[j]=1;
                        break;
                    }
                }
            }
        }
    }
    cout<<ret<<endl;

}

2、兴趣计数。

#include <vector>
#include <iostream>

using namespace std;

int users[300010];
int query[300010][3];

int query_num(int l,int r,int k)
{
    int ret=0;
    for(int i=l;i<=r;i++)
    {
        if(users[i]==k)
            ret++;
    }
    return ret;
}

int main()
{
    //init
    int n,q;
    cin >> n;
    for (int i=1;i<=n;i++)
        cin>>users[i];
    cin>>q;
    for (int i=0;i<q;i++)
    {
        cin>>query[i][0];
        cin>>query[i][1];
        cin>>query[i][2];
    }
    //process
    for(int i=0;i<q;i++)
    {
        cout<<query_num(query[i][0],query[i][1],query[i][2])<<endl;
    }

}

附加1【编程题】

输出3骗了15%……

附加2【设计题】

今日头条会根据用户的浏览行为、内容偏好等信息,为每个用户抽象出一个标签化的用户画像,用于内容推荐。用户画像的存储、高并发访问,是推荐系统的重要环节之一。现在请你给出一个用户画像存储、访问方案,设计的时候请考虑一下几个方面:

  • 用户画像如何存储
  • 如何保证在线高并发、低延迟的访问
  • 机器宕机、负载均衡问题
  • 如果用户增长很快,在你的方案下,该如何扩容

1、建立用户关系映射表,用户和标签为常量,关系为映射。保存用户画像最好使用缓存,比如memcached,同时后端要落地到DB。
2、有了内存缓存的话,访问速度自然会有提升,除此之外,还要提高缓存的利用率,这样请求不会到DB去请求。3、同时还要减少单机查询流量,将不同用户分配到不同的机器上,可以采用分布式,比如按照用户的地区、ID的号段进行分开,这样每个机器的请求都是独立的,可以命中缓存,提高系统的性能。
4、一致性哈希,保证节点变化后用户访问的机器不变,比如之前在1号机器访问的用户还是到1号机器。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值