2015-08-11 [豌豆荚]--研发--1面

时间:2015-08-11  15:00 ~ 16:00

地点:北京邮电大学鸿通楼

类别:电面

 

1. 问简历。

 

2. 算法题:

平台:collabedit

/*

1. 将 string 转化为 integer
*/

#include <string>
#include <climits>

using std::string;

string trim(const string &str)
{
    int first_index = 0;
    
    while (first_index < str.size()) {
        if (str[first_index] != ' ')
            break;
        first_index++;
    }

    int last_index = str.size() - 1;
    while (last_index >= 0) {
        if (str[last_index] != ' ')
            break;
        last_index--;
    }

    return str.substr(first_index, last_index - first_index + 1);
}

// "abc"              -> 1 -> not string
// "123456789012345"  -> 2 -> too long
int last_err_code;


// " 123456 "          -> 123456
// " -123456"          -> -123456
// ""                  -> 0         last_err_code = 1
// " abc"              -> 0         last_err_code = 1
// "+"                 -> 0         last_err_code = 1
// "-"                 -> 0         last_err_code = 1
// "123456789012345"   -> 0         last_err_code = 2
int string_to_int(const string &str)
{
    int index = 0;
    bool is_negative = false;
    long long ret = 0;

    const string num_str = trim(str);
    
    if (num_str.size() == 0) {
        last_err_code = 1;
        return 0;
    }

    if (num_str[0] == '-') {
        is_negative = false;
        index = 1;
    } else if (num_str[0] == '+') {
        is_negative = true;
        index = 1;
    }

    if (index == 1 && index == num_str.size()) {
        // "+"
        // "-"
        last_err_code = 1;
        return 0;
    }

    while (index < num_str.size()) {
        if (num_str[index] < '0' || num_str[index] > '9') {
            // "abc"
            // "123cbd"
            last_err_code = 1;
            return 0;
        }
        
        ret = ret * 10 + (int)(num_str[index] - '0');
        
        if (ret > (long long)INT_MAX) {
            last_err_code = 2;
            return 0;
        }
        
        index++;
    }
    
    return is_negative ? -1 * (int)ret : (int)ret;
}

 

3. 算法题:

平台:collabedit

/*
给两个递增的整数数组 A 和 B,长度分别为 n 和 m。找出这两个数组中第 K 小的数。
例如:A = [1,2, 4, 8, 10], B = [2, 3, 4, 5], K = 4。第 K 小的数是 3。
*/

int last_err_code;


// Return -1 when error and set last_err_code
int find_kth_small(int A[], int n, int B[], int m, int K)
{
    int ans = 0;
    int index_a = 0;
    int index_b = 0;
    int index = 1;
    
    if (n < 0 || m < 0 || K > n + m || K <= 0) {
        last_err_code = 1;
        return -1;
    }
    
    while (index < K) {
        if (index_a < n && index_b < m) {
            if (A[index_a] < B[index_b])
                index_a++;
            else
                index_b++;
        } else if (index_a < n) {
                index_a++;
        } else {
                index_b++;
        }
        index++; // ERROR 当时忘记对index进行自增了!
    }

    if (index_a < n && index_b < m)
        ans = A[index_a] < B[index_b] ? A[index_a] : B[index_b];
    else if (index_a < n)
        ans = A[index_a];
    else
        ans = B[index_b];
    
    return ans;
}

时间复杂度:O(K)

面试官让优化一下:

int last_err_code;

// Return -1 when error and set last_err_code
int find_kth_small(int A[], int n, int B[], int m, int K)
{
    int a_left = 0;
    int b_left = 0;
    int k_2;
    int a_k_2;
    int b_k_2;

    if (n < 0 || m < 0 || K > n + m || K <= 0) {
        last_err_code = 1;
        return -1;
    }

    while (K > 2) {
        k_2 = (K - 1) / 2;
        a_k_2 = a_left + k_2;
        a_k_2 = a_k_2 < n - 1 ? a_k_2 : n - 1;
        b_k_2 = b_left + k_2;
        b_k_2 = b_k_2 < m - 1 ? b_k_2 : m - 1;

        if (A[a_k_2] == B[b_k_2]) {
            return A[a_k_2];
        } else if (A[a_k_2] < B[b_k_2]) {
            K -= a_k_2 - a_left;
            a_left = a_k_2;
            if (a_left == n - 1)
                return B[b_left + K - 2];
        } else {
            K -= b_k_2 - b_left;
            b_left = b_k_2;
            if (b_left == m - 1)
                return A[a_left + K - 2];
        }
    }

    if (K == 1)
        return A[a_left] < B[b_left] ? A[a_left] : B[b_left];
    return A[a_left] > B[b_left] ? A[a_left] : B[b_left];
}

 

posted @ 2015-08-11 23:47 loverszhaokai 阅读(...) 评论(...) 编辑 收藏