百度開發工程師的面試題(導航部門)
阿新 • • 發佈:2018-11-09
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