《劍指offer》系列 2

2021-06-18 13:53:52 字數 2706 閱讀 1040

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 這道題最直觀的解...