1. 程式人生 > >百度開發工程師的面試題(導航部門)

百度開發工程師的面試題(導航部門)

1. 程式改錯題:

#include "string.h"
#define TONUM(x) x - '0'

int matoi(char* p) 
{
    int i ;
    int res; 
    for (i = 0; i < strlen(p);i++)
    {
        res = res * 10 + TONUM(p[i]); 
    }
    return res;        //容易溢位
}

//首先理解本題目的願意,即本題目是將用字串表示的整數轉換成真正的字串

總共錯誤有3處

錯誤1:字串沒有做合法性檢驗,非空,只有數字等;

錯誤2:res區域性變數沒有初始化,導致計算溢位;

錯誤3:沒有考慮大數超過INT數值的範圍

錯誤4:沒有考慮負數的可能性---面試時沒有考慮到

修改結果如下(不考慮負數):

#include "string.h"
#define TONUM(x) x - '0'

int matoi(char* p) //未檢查p的合法性
{

    int i ;
    int res = 0; //錯誤1沒有初始化
    if (NULL == p)return -1;
    if (p[0] == '0')return -1;
    for (i = 0; i < strlen(p);i++)
    {
        if (p[i] < '0' || p[i] > '9')return -1;
        res = res * 10 + TONUM(p[i]);
        if(IsOverFlow(res))return res;
    }
    return res;        //容易溢位
}

2.//刪除連結串列指定value的節點,其中不考慮根節點

Node* DeleteList(int iValue)
{
    if (NULL == head)return NULL;
    Node* cur = head;
    Node* temp = head->next;
    while (temp)
    {
        if (temp->data == iValue){
            cur->next = temp->next;
            free(temp);
            temp = cur->next;
        }
        else{
            cur  = temp;
            temp = temp->next;
        }
    }
    if (head->data == iValue){//如果考慮根節點的話,增加這樣一段。
        temp = head;
        head = head->next;
        free(temp);
        temp = NULL;
    }
    return head;

}

Node* DeleteListNormal(int iValue)
{
    if (NULL == head)return NULL;

    Node* cur  = head;
    Node* next = head->next;

    while (cur)
    {
        if (iValue == cur->data)
        {
            if (cur == head)head = cur->next;
            next = cur;
            cur = cur->next;
            free(next);
            next = cur->next;
        }
        else
        {
            cur = next;
            next = next->next;
        }
    }
    return head;
}

3. 排序幾百億的資料,參考如下:

http://www.epubit.com.cn/article/301