《劍指offer》第三章高質量的代碼筆記

面試官會根據應聘者寫出的代碼的規範性來決定是否錄用他。
* 代碼書寫清楚。特別是白紙或白板上書寫的時候,速度慢一點沒事
* 規範代碼佈局清晰。縮進清晰
* 規範的代碼命名合理。

通常面試官會檢查應聘者代碼是否完成了基本功能、輸入邊界值是否能夠得到正確的輸出、是否對各種不合規範的非法輸入做出合理的錯誤處理
從3方面確保代碼的完整性
* 功能測試
* 邊界測試
* 負面測試,這個指各種可能的錯誤的輸入

三種錯誤處理的方法
* 用返回值告知調用者出錯
* 當發生錯誤是設置一個全局變量,容易遺忘檢測這個全局變量
* 拋出異常

面試題11:數值的整數次方

題目:實現函數 double Power(double base, int exponent),求base的exponent次方,不得使用庫函數。
知識點整理:
* double類型==判斷
* 指數爲負數,底數爲零切指數爲負數的倒數
“`java
#我把書中的代碼轉化成java了
public class Power {
public double getPower(double base, int exponent){

    if(equal(base, 0.0) && exponent < 0){
        System.out.println("base can not be 0.0 and exponent can not be negtive");
        return 0.0;
    }
    int absExponent = exponent;
    if(exponent < 0){
        absExponent = -exponent;
    }

    double result = this.PowerWithUnsignedExponent(base, absExponent);
    if(exponent < 0){
        result = 1.0 / result;
    }

    return result;
}
public double PowerWithUnsignedExponent(double base, int exponent){
    if(exponent == 0)
        return 1;
    if(exponent == 1)
        return base;

    double result = this.PowerWithUnsignedExponent(base, exponent >> 1);
    result *= result;

    if((exponent & 0x1) ==1)
        result *= base;

    return result;
}
Boolean equal(double num1, double num2){
    if((num1 - num2) > -0.000001 && (num1 - num2) < 0.000001){
        return true;
    }
    else{
        return false;
    }
}

}
“`

面試題12:打印1到最大數的n位輸

題目:輸入數字n,按順序打印出從1到最大的n位十進制數。比如輸入3,則打印出1,2,3一直到最大的3位數即999
知識點整理:
* n位數的範圍沒有規定,需要考慮大數問題
* 使用字符串或數組表達大數
* 如何打印字符串表示的數字,考慮”098”的打印。需要按照我們的閱讀吸光打印數字
“`java
public class MaxOfNDigits {
public void PrintToMaxOfNDigits(int n){
if(n <= 0)
return;

    char numbers[] = new char[n + 1];
    numbers[n] = '\0';

    for(int i = 0; i < 10; i++){
        numbers[0] = (char) (i + '0');
        Print1ToMaxOfNDigitsRecursively(numbers, n, 0);
    }
}

void Print1ToMaxOfNDigitsRecursively(char numbers[], int length, int index ){
    if(index == length-1){
        PrintNumbers(numbers, length);
        return;
    }

    for(int i = 0; i < 10; i++){
        numbers[index + 1] =( char)(i + '0');
        this.Print1ToMaxOfNDigitsRecursively(numbers, length, index + 1);
    }

}

void PrintNumbers(char numbers[], int length){
    int beginAt = length - 1;
    for(;beginAt > 0;beginAt--){
        if(numbers[beginAt] != '0')
            break;
    }

    for(;beginAt >= 0; beginAt--){
        System.out.print(numbers[beginAt]);
    }

    System.out.println();;
}

}

```

面試題13:在O(1)時間刪除鏈表節點

題目:給定單向鏈表的頭指針和一個節點指針,定義一個函數在O(1)時間刪除該節點。
知識點整理:
* 把下一個節點的內容複製到需要刪除的節點上覆蓋原有的內容,再把下一個節點刪除,相當於刪除前一個節點
* 考慮一些“如果…那麼…”的情況。如果要刪除的節點位於鏈表的尾部,那麼沒有下一個節點,怎麼辦?如果鏈表中只有一個節點,而我們又要刪除鏈表的頭結點。
* 書中的算法是基於一個假設,要刪除的節點不在鏈表中呢
PS java中這個鏈表的實現有點小麻煩,我就沒有做了

面試題14:調整數組順序使奇數位於偶數前面

題目:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分
知識點整理:
* 考慮擴展性,如果這裏的條件換成所有負數都在非負數的前面,或者能被3整除的數都在不能被3整除的數的前面
* 書中的方式是講這些條件單做一個函數傳入,這是使用c++的思路來做的。在java中,可以定義一個接口,或者虛類,來實現這個條件函數。將這個接口或者虛類傳入就可以了。下面的代碼哦沒有實現。

```java
/**
 * 調整數組數學使奇數位於偶數前面
 * @author wq
 *
 */
public class offer14ReorderOddEven {
public int[] getReorderOddEven(int data[]){
    if(data.length == 0 )
        return data;

    int start = 0, end = data.length - 1;
    while(start < end){
        while(start < end && (data[start] & 0x1 ) != 0){
            start++;
        }

        while(start < end &&  (data[end] & 0x1) == 1){
            end--;
        }

        if(start < end){
            int temp = data[start];
            data[start] = data[end];
            data[end] = data[temp];
        }
    }

    return data;
}

}
“`

面試題15:鏈表中倒數第k個節點

題目:輸入一個鏈表,輸出該鏈表中倒數第k個節點。爲了符合大多數人的習慣,本題從1開始計數,即鏈表的尾節點是倒數第1個節點。例如一個鏈表有6個節點,從頭節點開始它們的值依次是1,2,3,4,5,6。這個鏈表的倒數第3個節點是值爲4的節點。
知識點總結:
* 思路:定義兩個指針,中間間隔k個節點,一起運動,當最後一個節點到達末尾的時候,第一個節點指示的數就是倒數第k個節點。
* 可能會遇到的問題:當輸入鏈表爲空指針,鏈表中節點數量少於k,輸入的參數k爲0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章