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 <cstring>
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

int last_err_code = 0;
// last_err_code = 0 when there is no error
//
// last_err_code = 1 when there is invalid characters, the valid characters
//                   are 0~9, ‘.‘, ‘+-‘
//
// last_err_code = 2 when there is no integer before ‘.‘ or there is no integer
//                   after ‘.‘
//                   e.g. ".123", "123.", "."
//
// last_err_code = 3 when there is more than one ‘.‘
//                   e.g. "123..456", "123.4.56"
//
// last_err_code = 4 when the integer is bigger than FLOAT_MAX
//                   e.g. "1111111111111111111111111111111111111.23"
//

// Clear the left and right whitespace
// e.g. "  123 456  " -> "123 456"
char *trim(char *str)
{
    while (*str == ‘ ‘ || *str == ‘\t‘)
        str++;

    char *start = str;

    if (!(*str))
        return str;

    char *end = str;

    while (*str) {
        if (*str != ‘ ‘ && *str != ‘\t‘)
            end = str;
        str++;
    }

    *(end + 1) = 0;

    return start;
}

// String to Float
float str_to_float(const char *pstr)
{
    char *pstr_copy, *str;
    // The sign of float, set -1 when the first character is ‘-‘
    int sign = 1;
    // The value of integers
    long long integer = 0;
    // The value of decimals
    double decimal = 0;
    // The multiple of next decimal
    double dec_num = 0.1;
    // Has found dot ‘.‘
    bool has_dot = 0;
    // Has integer
    bool has_integer = 0;

    if (pstr == NULL)
        return 0;

    pstr_copy = strdup(pstr);
    str = trim(pstr_copy);

    if (!(*str)) {
        // "   "
        return 0;
    }

    if (*str == ‘+‘ || *str == ‘-‘) {
        if (*str == ‘-‘)
            sign = -1;
        str++;
    }

    while (*str) {

        if (*str >= ‘0‘ && *str <= ‘9‘) {

            if (!has_dot) {
                // "123"
                if (!has_integer)
                    has_integer = 1;

                integer *= 10;
                integer += *str - ‘0‘;

                if (integer > (long long)INT_MAX) {
                    // e.g. "111111111111111111111111111111111.22"
                    last_err_code = 4;
                    return 0;
                }

            } else if (!has_integer) {
                // ".123"
                last_err_code = 2;
                return 0;
            } else {
                // "123.456"
                if (dec_num < (double)1e-10) {
                    // There are too many decimals, ignore the following decimals
                } else {
                    decimal += (*str - ‘0‘) * dec_num;
                    dec_num *= 0.1;
                }
            }

        } else if (*str == ‘.‘) {

            if (has_dot) {
                // e.g. "123...456"
                last_err_code = 3;
                return 0;
            }
            has_dot = 1;

        } else {
            // e.g. "123fgh?.456"
            last_err_code = 1;
            return 0;
        }

        str++;
    }

    if (has_dot && (!has_integer || dec_num == 0.1)) {
        // e.g. ".123" or "123." or "."
        last_err_code = 2;
        return 0;
    }

    free(pstr_copy);

    float ret = (float) integer + (float)decimal;
    return ret * sign;
}

int main()
{
    const struct TestCase {
        const char *str;
        const float ret;
        int last_err_code;
    } test_cases[] = {
        // last_err_code != 0
        { "abc", 0, 1 },
        { "123+.456", 0, 1 },
        { "++123.456", 0, 1 },

        { ".", 0, 2 },
        { ".123", 0, 2 },
        { "123.", 0, 2 },

        { "123..456", 0, 3 },
        { "123.4.56", 0, 3 },

        // Case #8:
        { "1111111111111111111111111111111.456", 0, 4 },

        // last_err_code == 0
        { "", 0, 0 },
        { "123.456", 123.456, 0 },
        // There are too many decimals
        { "1.12345678901234567890", 1.12345678, 0 },
    };

    int errors = 0;

    for (int iii = 0; iii < sizeof(test_cases) / sizeof(TestCase); iii++) {
        const TestCase &tc = test_cases[iii];
        // Clear last_err_code
        last_err_code = 0;
        const float actual_ret = str_to_float(tc.str);

        if (tc.ret != actual_ret || last_err_code != tc.last_err_code) {

            errors++;

            cout << "Case #" << iii << ": FAILED" <<  endl;
            cout << "\tExpected ret=" << tc.ret << endl;
            cout << "\tAcutal   ret=" << actual_ret << endl;
            cout << "\tExpected last_err_code=" << tc.last_err_code << endl;
            cout << "\tAcutal   last_err_code=" << last_err_code << endl;
        }
    }

    if (errors == 0)
        cout << "All test passed!" << endl;
    else
        cout << "There are " << errors << " cases failed." << endl;

    return 0;
}

2. longest increasing subsequence

源码链接:https://github.com/loverszhaokai/ALG/blob/master/src/longest_increasing_subsequence.cc

// Return the length of the longest increasing subsequence
// e.g. return 4 if nums = { 1, 9, 8, 2, 3, 9 }
int longest_increasing_subsequence(const std::vector<int> &nums)
{
    std::vector<int> max_value(nums.size());

    if (nums.size() == 0)
        return 0;

    max_value[0] = nums[0];

    int start = 0;
    int max_len = 1;
    int cnt_value;

    for (int iii = 0; iii < nums.size(); iii++) {
        cnt_value = nums[iii];

        for (int jjj = max_len - 1; jjj >= 0; jjj--) {

            if (cnt_value > max_value[jjj]) {

                max_value[jjj + 1] = cnt_value;

                if (jjj == max_len - 1)
                    max_len++;
                break;
            }
        }

    }

    return max_len;
}
时间: 2024-10-26 23:53:05

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

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

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 <

博客数据抓取总结

今天下午的总结让我发现了自己的几个缺点,立此为证,以求改变. 第一点,事前观察不够仔细.事先在源代码上发现了几个数据就急着着手去做,没有观察完所有的数据,导致做到一半才发现有些是js代码执行后才出现的数据,与一般静态源代码的数据的抓取方式不同. 第二点,坚持耐性尚缺.遇到了因为版本问题等而导不出数据到Excel,动态数据抓取不了,网站各种标记不同等问题,而暂时放弃去做另外的项目.其实这个时候我还有更好的解决方案,就是求助老师.这也就是我的第三点,要记得在关键时候适当得求助别人,不管是老师还是同学

大数据抓取采集框架(摘抄至http://blog.jobbole.com/46673/)

摘抄至http://blog.jobbole.com/46673/ 随着BIG DATA大数据概念逐渐升温,如何搭建一个能够采集海量数据的架构体系摆在大家眼前.如何能够做到所见即所得的无阻拦式采集.如何快速把不规则页面结构化并存储.如何满足越来越多的数据采集还要在有限时间内采集.这篇文章结合我们自身项目经验谈一下. 我们来看一下作为人是怎么获取网页数据的呢? 1.打开浏览器,输入网址url访问页面内容.2.复制页面内容的标题.作者.内容.3.存储到文本文件或者excel. 从技术角度来说整个过程

ngrep环回接口数据抓取方法,使用-d lo参数

ngrep环回接口数据抓取方法,使用-d lo参数,注意顺序: ngrep -W byline -d lo port 80

利用Selenium制作python数据抓取,以及对Selenium资源介绍

当当当~第三篇博客开始啦~ 这次的话题是数据抓取.终于到了核心部分的探讨,我的心情也是非常激动啊!如果大家baidu或者google(如果可以的话)数据抓取或者data crawling,将会找到数以千计的例子.但是大多数的代码非常的冗长,并且许多代码还是抓取静态数据之后,对动态JS写成的数据却毫无办法.或者,利用HTML解析网址后,再找到JS写的数据页面来寻找到所想要的数据. 但是!不知各位是否有发现过,如果打开chrome或者safari或者各种浏览器的审查元素.网页上能看到的数据,其实都会

delphi 用idhttp做web页面数据抓取 注意事项

这里不讨论webbrowse方式了 .直接采用indy的 idhttp  Get post 可以很方便的获取网页数据. 但如果要抓取大量数据 程序稳定运行不崩溃就不那么容易了.这几年也做了不少类似工具 总结了几点 好记性不如烂笔头. 内存泄露 获取页面文本 少不了用到html解析 具体到delphi 估计采用mshtml htmltotext 方法的不少,这个方案再大数据量时就会内存溢出 导致程序崩溃,而这并不是每个程序员都知道.解决的方案:采用自己的html解析类 这里我要感谢 武稀松(csd