劍指Offer習題

2021-09-12 02:03:02 字數 3704 閱讀 4909

1.二維陣列中的查詢

題目:在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

**:

bool find(int target, vector> array)  else 

}return false;

}

2.替換空格

題目:

void replacespace(char *str,int length) 

if (len == 0) return;

int new_length = len2 + 2 * len;

while (len2 >= 0 && new_length >= len2) else

}return;

}

3.從尾到頭列印鍊錶

題目:輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。

思路:用乙個臨時棧。

vectorprintlistfromtailtohead(listnode* head) 

int temp;

while (!node.empty())

return linklist;

}

4.重建二叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

思路:先序遍歷第乙個節點一定是根節點,然後再去看中序,中序里根節點的左面的節點一定在左子樹,右邊一定在右子樹。然後進行遞迴。

treenode* reconstructbinarytree(vectorpre,vectorvin) 

vectorleft_pre, right_pre, left_vin, right_vin;

treenode *node = new treenode(pre[0]);

int length = 0;

while (pre[0] != vin[length] && length < pre.size())

for (int i = 0; i < length; i++)

for (int i = length + 1; i < pre.size(); i++)

node->left = reconstructbinarytree(left_pre, left_vin);

node->right = reconstructbinarytree(right_pre, right_vin);

return node;

}

5.用兩個棧實現佇列

題目:用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

class solution

int pop()

}int val = stack2.top();

stack2.pop();

return val;

}private:

stackstack1;

stackstack2;

};

6.旋轉陣列的最小數字

題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。

int minnumberinrotatearray(vectorrotatearray) 

for (int i = 0; i < rotatearray.size() - 1; i++)

return rotatearray[0];

}

7.斐波那契數列

題目:大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。

n<=39

int fibonacci(int n) else if (n == 1) 

int fb1 = 0, fb2 = 1, fbn = 0;

for (int i = 2; i <= n; i++)

return fbn;

}

8.跳台階

題目:乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法(先後次序不同算不同的結果)。

思路:用遞迴的思想 f(n) = f(n - 1) + f(n - 2);

int jumpfloor(int number)  else if (number == 1)  else if (number == 2)  else 

}

9.**跳台階

題目:乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

int jumpfloorii(int number) 

int count = 0;

for (int i = 1; i <= number; i++)

return count;

}

10.矩形覆蓋

題目:我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?

思路:遞迴或者斐波那契

//遞迴

int rectcover(int number) else if (number == 1) else if (number == 2) else

}//斐波那契

int rectcover(int number) else if (number == 1) else if (number == 2)

int fn, f1 = 1, f2 = 2;

for (int i = 3; i <= number; i++)

return fn;

}

11.二進位制中的個數

題目:輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。

關鍵字:位運算

int  numberof1(int n) 

flag = flag << 1;

}return count;

}//o(1)

int numberof1(int n)

12.數值的整數次方

題目:給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

double power(double base, int exponent) 

return ans;

}

13.調整陣列的順序使奇數字於偶數的前面

題目:輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

void reorderarray(vector&array) }}

}

現在只做了這幾道題,隨著之後的學習,以後還會更新~

劍指Offer習題3 4

思路 一 陣列查詢 折半 二分 查詢 int binsearch int arr,int len,int key else if arr mid key else return mid bool search int arr 4 int key len int newlen len count 2 ...

劍指offer習題集

一 二維陣列的查詢 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。思路 從左下角元素往上查詢,右邊元素是比這個元素大,上邊是的元素比這個元素小。於是,tar...

劍指offer習題集

1.過載賦值運算子函式 具體見 普通做法 cmystring cmystring operator const cmystring str 更加安全的做法,普通做法在new記憶體不足情況下,已經將原值delete cmystring cmystring operator const cmystrin...