1.求斐波那契數列的第n項
這個題目很簡單,講遞迴的書上都是用這個來講的,但是面試的時候,如果你寫個遞迴,那估計會讓人失望的,因為遞迴的效率真是乙個問題,你可以測試一下,輸入50,基本上得到結果的時間,夠你去喝杯茶了
#include using namespace std;
//使用遞迴效率太低了,甚至可能造成棧溢位
/*int fabonacci1(int n)
*/int fabonacci2(int n)
return num3;
}int main()
return count;
}*/
但是這樣有乙個缺點,如果輸入的數是負數怎麼辦呢?右移一位,左邊的最高位補上的是1,到最後變成了0xffffffff,陷入了死迴圈
第二種:我們可以把移動1,每次比較之後,左移1一位,然後做與運算,就是下面的這樣
/*int number_of1_in_binary(int m)
return count;
}*/
但是這樣我們就移動了32次,是不是有點多?,還有沒有其它方法?
第三種方法:考察乙個數7,二進位制111,7-1 = 6的二進位制是110, 然後&7 = 110是6, 6-1 = 5的二進位制是101,然後&6 = 100是4, 4-1 = 3的二進位制是011,然後&4 = 0,我們發現每次把這個數-1然後與上這個數,得到數是原來這個數的最後右邊的1變為0的值,由此我們得到如下的解法:
int number_of1_in_binary(int m)
return count;
}
3.實現庫函式power(double base, double exponent),不使用庫函式,同時不考慮大數問題
如果你大筆一揮,一分種內寫下如下的**:那你就是和我一樣的人,別人offer跳板的人
double power(double base, int exp)
return ret;
}
1.如果指數是負數怎麼辦?
2.如果指數是負數而且底數是0怎麼辦?0的倒數是沒有意義的
再加上考慮的這兩點,我們完善一下我們的**
bool flag = true;
bool equal(double m, double n)
double power(double base, double exp)
return ret;
}double power(double base, int exp)
unsigned int temp = (unsigned int)exp;
if(exp < 0)
temp = 0-exp;
double ret = power(base, temp);
if(exp<0) return 1.0/ret;
return ret;
}
這裡還考察了這些細微的程式設計知識,對於浮點數如何和0比較,對於錯誤如何返回更好
4. 輸入乙個數字,列印從1到最大的n位十進位制數,比如輸入3,列印從1到999的所有數字
如果我們反應快,很快就能想到,可以先求出這個最大的數,然後列印:
void print_to_max_number(int n)
for(int i = 1; i < m; i++)
cout《但是這裡我們沒有考慮大數的問題了,如果n很大怎麼辦?
大數問題一般都是用陣列或者字串儲存每一位,這裡我們用字串
bool increment(char *num)
} else
}return isoverflow;
}void printnum(char *s)
listnode;
void deletenode(listnode**head, listnode *node)
else if(*head == *node)//這個節點是頭節點
else//這個節點是最後乙個節點
}
需要注意的是如果這個節點是頭節點,或者是最後乙個節點怎麼辦
6.輸入乙個陣列,調整該陣列的順序,使得奇數字於陣列的前面,偶數字於陣列的後面
常規思維,從前往後遍歷,找到乙個偶數就把這個數後面的所有數往前移動一位,然後把這個數放到最後乙個位置,時間複雜度為
o(n2),太高了解題思路,利用爽指標法,前後各乙個指標,然後前指標找到的偶數和後指標找到的奇數交換就可以了,時間復
雜度為o(n)
void reorderarray(int a, int len)
}
}
雙指標法的應用常常能得到意外的收穫
7.輸入乙個連表,求該鍊錶的倒數第k個節點
採用雙指標法,乙個指向第乙個節點,乙個指向第k個節點,然後同時往後移動,兩個差距為k,然後乙個到達最後乙個節點的時候,另乙個就是倒數第k個節點
slnode getknode(slnode head, int k)
if(node1 == null)
return null;
while(node1->next != null)
return node2;
}
《劍指offer》系列 1
最近一直在看劍指offer,這上面的題目都是比較考察程式設計能力的,打算做個記錄,把寫過的 儲存下來 1.實現乙個string類 面試官的考察點應該在以下幾點 1.模板類的書寫 2.對於賦值函式考察的幾點 1 是否返回引用,因為只有返回引用,才能連續的進行賦值 2 引數是否是常量 3 是否是自身賦值...
劍指offer系列2之替換空格
思路一 順序遍歷字串並複製相應的字元到新的字串中。時間複雜度o n o n o n 空間複雜度o n o n o n python實現 coding utf 8 class solution s 源字串 defreplacespace self,s write code here s re for ...
劍指Offer 陣列 (2)
知識點 查詢 資料結構 陣列 題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 劍指offer 這道題最直觀的解...