面試官會根據應聘者寫出的代碼的規範性來決定是否錄用他。
* 代碼書寫清楚。特別是白紙或白板上書寫的時候,速度慢一點沒事
* 規範代碼佈局清晰。縮進清晰
* 規範的代碼命名合理。
通常面試官會檢查應聘者代碼是否完成了基本功能、輸入邊界值是否能夠得到正確的輸出、是否對各種不合規範的非法輸入做出合理的錯誤處理
從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