剣指offer 4日目

2943 ワード

三日もたたないうちに4日目までがんばった

第三章高品質のコード


3.2コードの規範性

  • 書く
  • レイアウト
  • 名前
  • 3.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)時間で削除チェーンテーブルノード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は、奇数が偶数の前に考えられるように配列順序を調整し、2つのポインタを1つ前に後ろに中間に移動させるコードを以下のように設定する.
    void qiou(int a[],int n){
    int i,j,t,temp;
    i=0;
    j=n-1;
    temp=a[0];
    while (i!=j) {
        while (i

    面接問題15チェーンテーブルの中で最後からk番目のノードは1つのチェーンテーブルとk出力チェーンテーブルの中で最後からk番目のノードの構想を入力します私の構想はチェーンテーブルを遍歴して1つの配列の中で最後から何番目かを取るのが便利です
    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]);
    }
    

    本の上で考えて2つのポインタをして第1の先にk-1歩それから2つはいっしょに第1の歩いて尾のノードの第2の歩いて最後から第kのノードのコードは以下の通りです
    void booklastK(struct node *head,int k){
    struct node *p1,*p2;
    p1=head;
    p2=head;
    for (int i=0; inext==NULL) {
            printf("error");
            return;
        }
        p1=p1->next;
    }
    while (p1->next!=NULL) {
        p1=p1->next;
        p2=p2->next;
    }
    printf(" %d %d",k,p2->data);
    }
    

    関連するテーマはチェーンテーブルの中間ノードを求めて2つのポインタをして、1つは1回2歩歩いて、1つは1回1歩歩いて、1つは1歩速くて末尾まで歩いて遅いのは中間ノードが単一のチェーンテーブルが1回2歩歩いているかどうかを判断して、1つは1回1歩歩いて、もし歩くのが速くて追いつくのが遅い説明はループ思考があるならば、私たちが1つのポインタでチェーンテーブルを遍歴して問題を解決できない時、2つのポインタでチェーンテーブルを遍歴することを試みることができます.そのうちの1つは歩くのが速くて、あるいは先にいくつか歩いて、もう1つは歩くのが遅くて、あるいは歩くのが遅いです.