2015-08-11 [今日头条]--数据抓取和处理工程师--2面

时间:2015-08-11 11:30 ~ 12:30

地点:知春路甲48号盈都大厦B座11层今日头条

1. 先对着简历的项目问了许多。

2. 算法题:一个按顺序排好的数组,从某一个位置开始将后面的数移动到前面。例如,"123456789" -> 从第7个元素开始移动到最前面,"789123456", 在这种情况下查找一个数。

int search(int A[], int left, int right, int target)
{
        if (left < right)
                return -1;
        int middle = (left + right) / 2;
        if (A[middle] == target)
                return middle;
        else if (A[right] < target)
                return search(A, left, middle - 1, target);
        else if (A[middle] < target)
                return search(A, middle + 1, right, target);
        else
                return search(A, left, middle - 1, target);
}

3. 算法设计题:

实现一个方法 bool visit(const string &ip); 该方法满足一下需求,限制每一个IP地址一个小时内最多访问5w次,如果超过5w次,那么返回false,否则返回true。注意:这一小时是滑动的。也就是随着时间一直在移动的范围。

struct IPInfo {
    int count[3600];  // 存储每一秒的访问次数
    int index;        // count的index
    int total_visits; // 这一小时内的访问次数
    int last_time;    // 上一次访问的时间,以秒为单位
    int cnt_visits;   // 当前这一秒访问次数
};

map<string, IPInfo> ip_info;

bool visit(const string &ip)
{
    const int cnt_time = get_cnt_time(); // 获得当前时间,以秒为单位

    if (ip_info.find(ip) == ip_info.end()) {
        // 该IP地址第一次访问
        IPInfo ipf;
        ipf.index = 0;
        ipf.total_visits = 0;
        ipf.last_time = cnt_time;
        ipf.cnt_visits = 1;
        ip_info[ip] = ipf;

        return true;
    }

    IPInfo &ipf = ip_info[ip];
    int cnt_total_visits, old;

    if (ipf.last_time == cnt_time) {
        // 跟上一次是同一秒访问的
        ipf.cnt_visits++;
        cnt_total_visits = ipf.total_visits - ipf.count[ipf.index] + ipf.cnt_visits;
        if (cnt_total_visits > 50000)
            return false;
        return true;
    } else {
        // 跟上一次 不是 同一秒访问的
        // 写入last_time的访问量到count[index]
        ipf.total_visits -= ipf.count[ipf.index];
        ipf.count[ipf.index] = ipf.cnt_visits;
        ipf.total_visits += ipf.cnt_visits;
        ipf.index++;
        ipf.index %= 3600;

        if (cnt_time > ipf.last_time + 1) {
            // last_time = 3s
            // cnt_time = 5s
            // 那么需要将index移动2次,并且total_visits要减去那些旧的访问量
            int i = cnt_time - ipf.last_time - 1;
            while (i--) {
                ipf.total_visits -= ipf.count[ipf.index];
                ipf.count[ipf.index] = 0;
                ipf.index++;
                ipf.index %= 3600;
            }
        }

        ipf.cnt_visits = 1;
        ipf.last_time = cnt_time;

        if (ipf.total_visits + 1 > 50000)
            return false;
        return true;
    }
}

4. 看过什么书

《C++Primer》

《C++程序设计语言》

《Effective C++》

5. 做过什么项目

1. 看过chrome源码。大概一个月。

2. ALG 算法相关的项目。https://github.com/loverszhaokai/ALG

时间: 2024-11-03 21:39:35

2015-08-11 [今日头条]--数据抓取和处理工程师--2面的相关文章

2015-09-09 [一点资讯]--数据抓取和处理工程师--2面

时间:2015-09-09 11:00 ~ 12:00 地点:北京市海淀区王庄路1号 清华同方科技广场D座 西区 7层 1. str to float 源码链接:https://github.com/loverszhaokai/Demo/blob/master/str_to_float/src/str_to_float.cc #include <climits> #include <cmath> #include <cstdlib> #include <cstri

2015-09-09 [一点资讯]--数据抓取和处理工程师--5面

时间:2015-09-09 15:40 ~ 16:40 地点:北京市海淀区王庄路1号 清华同方科技广场D座 西区 7层 这面是HR面.聊创业公司和大公司的优缺点.工作时间和年假问题.一周工作6天,OMG.一年7天假,OMG. 但是,一点资讯竟然在硅谷有Office,巨想去. 总结:不错的创业公司,值得拥有!

2015-09-09 [一点资讯]--数据抓取和处理工程师--4面

时间:2015-09-09 14:40 ~ 15:40 地点:北京市海淀区王庄路1号 清华同方科技广场D座 西区 7层 1. 问项目经验和看过什么书 2. 有3N+1个整数,其中只有一个数出现了一次,其它的数都出现了3次,查找唯一出现一次的那个数. https://leetcode.com/problems/single-number-ii/ https://github.com/loverszhaokai/leetcode/blob/master/137_no/sol_bit_manipula

2015-09-09 [一点资讯]--数据抓取和处理工程师--3面

时间:2015-09-09 13:40 ~ 14:40 地点:北京市海淀区王庄路1号 清华同方科技广场D座 西区 7层 1. A 和 B 有多少bit不一样 #include <climits> #include <cmath> #include <cstdlib> #include <cstring> #include <iostream> #include <iomanip> #include <string> usi

Python 爬虫工程师必学 App数据抓取实战

第1章 课程介绍介绍课程目标.通过课程能学习到的内容.学会这些技能能做什么,对公司业务有哪些帮助,对个人有哪些帮助.介绍目前app数据抓取有哪些困难,面临的挑战,本实战课程会利用哪些工具来解决这些问题,以及本实战课程的特点 ... 1-1 python爬虫工程师必备技能--App数据抓取实战课程导学第2章 windows下搭建开发环境介绍项目开发需要安装的开发软件,讲解了安卓模拟器对比以及夜神安卓模拟器安装.介绍.简单使用和Genymotion安卓模拟器简单分析 介绍App应用抓包工具对比以及f

Ajax异步数据抓取

1.简介 1 有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样,在浏览 2 器中可以看到正常显示的页面数据,但是使用requests得到的结果并没有.这是因为requests获取的 3 都是原始的HTML文档,而浏览器中的页面则是经过JavaScript处理数据后生成的结果,这些数据的 4 来源有多种,可能是通过ajax加载的,可能是包含在HTML文档中的,也可能是经过JavaScript和特 5 定算法计算后生成的. 6 对于第一种情况,数据加载是一种异步加

Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. 先进行所有页面的内容进行抓取 var page =require('webpage').create(); var address='http://product.pconline.com.cn/server/'; var fs = require('fs'); var mypath = 'ver

Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)

概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868880 后进行的第二部分,请各位读者在看这篇博客之前先浏览上一篇,因为这里面有部分代码会沿用到上一部分的抓取结果. 好,现在开始正式的抓取图片的讲解 首先,我们先来看看代码: var page =require('webpage').create(); var address='http://pro

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby 数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什