劍指offer 第四天

事不過三 竟然堅持到了第四天

第三章 高質量的代碼

3.2 代碼的規范性

  • 書寫
  • 布局
  • 命名

3.3 代碼的完整性

設計測試用例

  • 功能測試 完成基本功能外,考慮更多功能需求(大數問題)
  • 邊界測試 循環和遞歸的邊界是否正確
  • 負面測試 可能的錯誤的輸入

三種錯誤處理的方法

  • 返回值
  • 全局變量
  • 拋出異常

面試題11 數值的整數次方 求base的exponent次方
要考慮全面
e=0 e<0 e>0 base=0
代碼如下

double PowerEnotMinus(double base,int exponent){
if (exponent==0) return 1;
double result=1.0;
for (int i=1; i<=exponent; i++) {
    result *= base;
}
return result;
    }
int equal(double num1,double num2){
if (num1 - num2 > -0.0000001 && num1 -     num2 < 0.0000001) {
    return 1;
}else{
    return 0;
}
}
double Power(double base,int exponent){
//如果底數是0 返回0
if (equal(base,0.0)) {
    return 0;
}
//如果指數小于0
if (exponent<0){
    double newresult=PowerEnotMinus(base, -exponent);
    return 1.0/newresult;
}
return PowerEnotMinus(base, exponent);
}

面試題13 在0(1)時間刪除鏈表節點
給定一個單鏈表的頭指針和一個節點指針 在0(1)時間刪除鏈表節點p
思路 正常情況下 刪除一個節點 我們需要遍歷鏈表 拿到p前面的一個節點k,讓k指向p->next 但是在0(1)時間,所以我們不能遍歷。我們拿不到k,但是能拿到p之后的節點,我們把p之后的節點s的data賦給p 讓p指向s->next
代碼如下

struct node * delete(struct node *head,struct node *p){
struct node *s=head;
//如果要刪除的節點是尾節點 那么只能遍歷
if (p->next==NULL) {
    while (s->next!=p) {
        s=s->next;
    }
    s->next=NULL;
    return head;
}
//如果要刪除的節點是頭節點 那么頭節點指向下一個即可
if (p==head) {
    if (head->next) {
        head=head->next;
    }else{
        head=NULL;
    }
    return head;
}
//把p下一個節點的值賦給p
p->data= p->next->data;
//p指向下下個節點
p=p->next->next;
return head;
}

面試題14 調整數組順序使奇數在偶數前
思路 用快排的思路 設置兩個指針一個在前 一個在后 向中間移動
代碼如下

void qiou(int a[],int n){
int i,j,t,temp;
i=0;
j=n-1;
temp=a[0];
while (i!=j) {
    while (i<j && a[j]%2==0) {
        j--;
    }
    while (i<j && a[i]%2 !=0) {
        i++;
    }
    if (i<j) {
        t=a[j];
        a[j]=a[i];
        a[i]=t;
    }
}
}

面試題15 鏈表中倒數第k個節點
輸入一個鏈表和k 輸出鏈表中倒數第k個節點
思路
我的思路 遍歷鏈表存儲到一個數組中 取倒數第幾個就很方便了

void lastK(struct node *head,int k){
struct node *p=head;
int a[100];
int i=0;
while (p) {
    a[i]=p->data;
    i++;
    p=p->next;
}
printf("倒數第%d個%d",k,a[i-k]);
}

書上思路 搞兩個指針 第一個先走k-1步 然后兩個一起走 第一個走到尾節點 第二個就是倒數第k個節點
代碼如下

void booklastK(struct node *head,int k){
struct node *p1,*p2;
p1=head;
p2=head;
for (int i=0; i<k-1; i++) {
    if (p1->next==NULL) {
        printf("error");
        return;
    }
    p1=p1->next;
}
while (p1->next!=NULL) {
    p1=p1->next;
    p2=p2->next;
}
printf("倒數第%d個%d",k,p2->data);
}

相關題目
求鏈表中間節點 搞兩個指針,一個一次走兩步,一個一次走一步 走的快的走到末尾 走的慢的是中間節點
判斷單鏈表有沒有環 個一次走兩步,一個一次走一步,如果走的快的追上走的慢的 說明有環
思考 當我們用一個指針遍歷鏈表不能解決問題的時候,可以嘗試用兩個指針來遍歷鏈表。其中一個走的快,或者先走幾步,另一個走的慢或者走的遲。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,138評論 0 12
  • 樹的概述 樹是一種非常常用的數據結構,樹與前面介紹的線性表,棧,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,475評論 1 31
  • 本文內容取自于小甲魚的數據結構與算法。http://www.lxweimin.com/p/230e6fde9c75 ...
    阿阿阿阿毛閱讀 2,920評論 0 7
  • 【聲明】歡迎轉載,但請保留文章原始出處→_→文章來源:http://www.lxweimin.com/p/08d08...
    夢工廠閱讀 3,783評論 3 31
  • 大學的時候不好好學習,老師在講臺上講課,自己在以為老師看不到的座位看小說,現在用到了老師講的知識,只能自己看書查資...
    和玨貓閱讀 1,470評論 1 3