下面是我整理的,劍指Offer前五章所有的題目以及相關(guān)題和拓展題的題目和答案。代碼的話放在github上,您可以下載下載使用。對(duì)您有用的話請(qǐng)給個(gè)star哦!
3.數(shù)組中重復(fù)的數(shù)字
題目1 找出數(shù)字中重復(fù)的數(shù)字
題目:在一個(gè)長度為n的數(shù)組里的所有數(shù)字都在0~n-1的范圍內(nèi),數(shù)組中某些數(shù)字是重復(fù)的,但不知道有那幾個(gè)數(shù)字重復(fù)了,也不知道每個(gè)數(shù)字重復(fù)了幾次。請(qǐng)找出數(shù)組中任意一個(gè)重復(fù)的數(shù)字。例如,如果輸入長度為7的數(shù)組{2,3,1,0,2,5,3},那么對(duì)應(yīng)的輸出是重復(fù)的數(shù)字2或者3
題目2 不修改數(shù)組找出重復(fù)的數(shù)字
題目:在一個(gè)長度為n+1的數(shù)組里的所有數(shù)字都在1~n的范圍內(nèi),所以數(shù)組中至少有一個(gè)數(shù)字是重復(fù)的。請(qǐng)找出數(shù)組中任意一個(gè)重復(fù)的數(shù)字,但不能修改輸入的數(shù)組。例如,如果輸入長度為8的數(shù)組{2,3,5,4,3,2,6,7},那么對(duì)應(yīng)的輸出是重復(fù)的數(shù)字2或者3。
4.二維數(shù)組中的查找
題目:在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組中是否含有該整數(shù)。
5.替換空格
題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),把字符串中的每個(gè)空格都替換成"%20"。例如,輸入"We are happy.",則輸出"We%20are%20happy."。
拓展題
題目:有兩個(gè)排序的數(shù)組A1和A2,內(nèi)存在A1的末尾有足夠多的空余空間容納A2。請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),把A2中的所有數(shù)字插入A1中,并且所有的數(shù)字是排序的。
6.從尾到頭打印鏈表
題目:輸入一個(gè)鏈表的頭節(jié)點(diǎn),從尾到頭反過來打印每個(gè)節(jié)點(diǎn)的值。鏈表節(jié)點(diǎn)定義如下:
struct ListNode {
int m_value;
ListNode* m_pNext;
}
7.重建二叉樹
題目:輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。例如,輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建如圖所示的二叉樹并輸出它的頭結(jié)點(diǎn)。二叉樹的定義如下:
struct BinaryTreeNode
{
int m_value;
BinaryTreeNode m_pLeft;
BinaryTreeNode m_pRight;
}
8.二叉樹的下一個(gè)節(jié)點(diǎn)
題目:給定一棵二叉樹和其中的一個(gè)節(jié)點(diǎn),如何找出中序遍歷序列的下一個(gè)節(jié)點(diǎn)?樹中的節(jié)點(diǎn)除了有兩個(gè)分別指向左、右節(jié)點(diǎn)的指針,還有一個(gè)指向父節(jié)點(diǎn)的指針。
9.用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
題目:用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列。隊(duì)列的聲明如下,請(qǐng)實(shí)現(xiàn)它的兩個(gè)函數(shù)appendTail和deleteHand,分別完成在隊(duì)列尾部插入節(jié)點(diǎn)和在隊(duì)列頭部刪除節(jié)點(diǎn)的功能。
template <typename T> class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T& element);
T delegeHead();
private:
stack<T> stack1;
stack<T> stack2;
};
拓展題1
題目:如何用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧
10.斐波那契數(shù)列
題目1
題目:寫一個(gè)函數(shù),輸入n,求斐波那契數(shù)列的第n項(xiàng)。斐波那契數(shù)列的定義如下:
題目2
題目:一直青蛙一次可以跳上1級(jí)臺(tái)階,也可以跳上2級(jí)臺(tái)階。求該青蛙跳上一個(gè)n級(jí)臺(tái)階總共有多少中跳法。
題目3
題目:一只青蛙一次可以跳上1級(jí)臺(tái)階,也可以跳上n級(jí)臺(tái)階。。。它也可以跳上n級(jí),此時(shí)青蛙跳上一個(gè)n級(jí)臺(tái)階總共有多少種跳法?
11.旋轉(zhuǎn)數(shù)組的最小數(shù)字
題目:把一個(gè)數(shù)組最開始的若干個(gè)元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。輸入一個(gè)遞增排序的數(shù)組的一個(gè)旋轉(zhuǎn),數(shù)組旋轉(zhuǎn)數(shù)組的最小元素。例如,數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個(gè)旋轉(zhuǎn),該數(shù)組的最小值為1.
12.矩陣中的路徑
題目:請(qǐng)?jiān)O(shè)計(jì)一個(gè)函數(shù),用來判斷在一個(gè)矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動(dòng)一格。如果一條路徑經(jīng)過了矩陣的某一格,那么該路徑不能再次進(jìn)入該格子。例如,在下面的3x4的矩陣中包含一條字符串‘a(chǎn)bfb’的路徑(路徑中的字母用下劃線標(biāo)出)。但矩陣中不包含字符串‘a(chǎn)bfb’的路徑,因?yàn)樽址牡谝粋€(gè)字符b占據(jù)了矩陣中的第一行第二個(gè)格子之后,路徑不能再次進(jìn)入這個(gè)格子。
a | b | t | g |
---|---|---|---|
c | f | c | s |
j | d | e | h |
13.機(jī)器人的運(yùn)動(dòng)范圍
題目:地上有一個(gè)m行n列的方格。一個(gè)機(jī)器人從坐標(biāo)(0,0)的格子開始移動(dòng),他每次可以向左、右、上、下移動(dòng)一格,但不能進(jìn)入行坐標(biāo)和列坐標(biāo)的位數(shù)之和大于k的格子。例如,當(dāng)k=18時(shí),機(jī)器人能夠進(jìn)入方格(35,37),因?yàn)?+5+3+7=18。但它不能進(jìn)入方格(35,38),因?yàn)?+5+3+8=19。請(qǐng)問該機(jī)器人能夠到達(dá)多少個(gè)格子。
14.剪繩子
題目:給你一根長度為n的繩子,請(qǐng)把繩子剪成m段(m、n都是整數(shù),n>1并且m>1),每段繩子的長度記為k[0],k[1],...,k[m]。請(qǐng)問k[0] X k[1] X k[2]...X k[m]可能的最大乘積是多少。例如,當(dāng)繩子的長度為8時(shí)。我們把它剪成長度分別為2、3、3的三段,此時(shí)得到的最大乘積是18。
15.二進(jìn)制中1的個(gè)數(shù)
題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)整數(shù),輸出該整數(shù),輸出該數(shù)二進(jìn)制中1的個(gè)數(shù)。例如,把9表示成二進(jìn)制是1001,有2位是1.因此,如果輸入9,則該函數(shù)輸出2。
16.數(shù)值的整數(shù)次方
題目:實(shí)現(xiàn)函數(shù)double Power(double base, int exponent),求base的exponent次方。不得使用庫函數(shù),同時(shí)不需要考慮大數(shù)問題。
17.打印從1到最大的n位數(shù)
題目:輸入數(shù)字n,按順序打印出1到最大的n位十進(jìn)制數(shù)。比如輸入3,則打印出1、2、3一直到最大的3位數(shù)999。
18.刪除鏈表節(jié)點(diǎn)
題目1 在o(1)時(shí)間內(nèi)刪除鏈表節(jié)點(diǎn)
給定單向鏈表的頭指針和一個(gè)節(jié)點(diǎn)指針,定義一個(gè)函數(shù)在o(1)時(shí)間內(nèi)刪除該節(jié)點(diǎn)。鏈表的節(jié)點(diǎn)與函數(shù)的定義如下:
struct ListNode {
int m_value;
ListNode* m_pNext;
}
void deleteNode(ListNode** pHeader, ListNode *pToBeDeleted);
題目2 刪除鏈表中重復(fù)的節(jié)點(diǎn)
在一個(gè)排序的鏈表中,如何刪除重復(fù)的節(jié)點(diǎn)?例如,在如下(a)中重復(fù)的節(jié)點(diǎn)被刪除之后,鏈表如下(b)所示。
- (a) 1 -> 2 -> 3 -> 3 -> 4 -> 4 -> 5
- (b) 1 -> 2 -> 5
19.正則表達(dá)式匹配
題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來匹配包含'.'和‘* ’的正則表達(dá)式。模式中的字符'.'表示任意一個(gè)字符, 而'* ' 表示它前面的字符可以出現(xiàn)任意次(含0次)。在本題中,匹配是指字符串中的所有字符匹配整個(gè)模式。例如,字符串"aaa"與模式"a.a"和"ab* ac * a"匹配,但與"aa.a"和"ab*a"均不匹配。
20.表示數(shù)值的字符串
題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來判斷字符串是否表示數(shù)值(包括證書和小數(shù))。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示數(shù)值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。
21.調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面
題目:輸入一個(gè)整數(shù)數(shù)組,實(shí)現(xiàn)一個(gè)函數(shù)來調(diào)整該數(shù)組中數(shù)字的排序,使得所有奇數(shù)位于數(shù)組的前半部分,所有偶數(shù)位于整數(shù)的后半部分。
22.鏈表中倒數(shù)第K個(gè)節(jié)點(diǎn)
題目:輸入一個(gè)鏈表,輸出該鏈表中倒數(shù)第K個(gè)節(jié)點(diǎn)。為了符合大多數(shù)人的習(xí)慣,本題將從1開始計(jì)數(shù),即鏈表的尾節(jié)點(diǎn)是倒數(shù)第1個(gè)節(jié)點(diǎn)。例如,一個(gè)鏈表有6個(gè)節(jié)點(diǎn),從頭結(jié)點(diǎn)開始,他們的值依次是1、2、3、4、5、6。這個(gè)鏈表的倒數(shù)第三個(gè)節(jié)點(diǎn)是值為4的節(jié)點(diǎn)。鏈表節(jié)點(diǎn)定義如下:
struct ListNode {
int m_value;
ListNode* m_pNext;
}
拓展題1
求鏈表的中間節(jié)點(diǎn)。如果鏈表中的節(jié)點(diǎn)總數(shù)為奇數(shù),則返回中間節(jié)點(diǎn);如果節(jié)點(diǎn)總數(shù)是偶數(shù),則返回中間兩個(gè)節(jié)點(diǎn)的任意一個(gè)。
23.鏈表中環(huán)的入口節(jié)點(diǎn)
題目:如果一個(gè)鏈表中包含環(huán),如何找出環(huán)的入口節(jié)點(diǎn)?例如,在如下圖的鏈表中,環(huán)的入口節(jié)點(diǎn)為3。
24.反轉(zhuǎn)鏈表
題目:定義一個(gè)函數(shù),輸入一個(gè)鏈表的頭節(jié)點(diǎn),反轉(zhuǎn)該鏈表并輸出反轉(zhuǎn)后鏈表的頭節(jié)點(diǎn)。鏈表節(jié)點(diǎn)定義如下:
struct ListNode {
int m_value;
ListNode* m_pNext;
}
25.合并兩個(gè)排序的鏈表
題目:輸入兩個(gè)遞增排序的鏈表,合并這兩個(gè)鏈表并使新鏈表中的節(jié)點(diǎn)仍然是遞增排序的。例如,輸入下圖的鏈表1和鏈表2,則合并之后的升序鏈表如鏈表3所示。鏈表節(jié)點(diǎn)定義如下
struct ListNode {
int m_value;
ListNode* m_pNext;
}
- 鏈表1:1 --> 3 --> 5 --> 7
- 鏈表2:2 --> 4 --> 6 --> 6
- 鏈表3:1 --> 2 --> 3 --> 4 --> 5 --> 6 --> 7 --> 8
26.樹的子結(jié)構(gòu)
題目:輸入兩顆二叉樹A和B,判斷B是不是A的子結(jié)構(gòu)。二叉樹的節(jié)點(diǎn)的定義如下:
struct BinaryTreeNode
{
int m_value;
BinaryTreeNode m_pLeft;
BinaryTreeNode m_pRight;
}
27.二叉樹的鏡像
題目:請(qǐng)完成一個(gè)函數(shù),輸入一棵二叉樹,該函數(shù)輸出它的鏡像。二叉樹節(jié)點(diǎn)的定義如下:
struct BinaryTreeNode
{
int m_value;
BinaryTreeNode m_pLeft;
BinaryTreeNode m_pRight;
}
28.對(duì)稱的二叉樹
題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),用來判斷一棵二叉樹是不是對(duì)稱的。如果一棵二叉樹和它的鏡像一樣,那么它是對(duì)稱的。例如,如所在圖所示的3棵二叉樹中,第一棵二叉樹是對(duì)稱的,而另外兩棵不是。
29.順時(shí)針打印矩陣
題目:輸入一個(gè)矩陣,按照從外向里以順時(shí)針的順序依次打印出每一個(gè)數(shù)字。例如,如果輸入如下矩陣:
1 | 2 | 3 | 4 |
---|---|---|---|
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
則依次打印出數(shù)字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
30.包含min函數(shù)的棧
題目:定義棧的數(shù)據(jù)結(jié)構(gòu),請(qǐng)?jiān)谠擃愋椭袑?shí)現(xiàn)一個(gè)能夠得到棧的最小元素的min函數(shù)。在該棧中,調(diào)用min、push及pop的時(shí)間復(fù)雜度都是o(1)。
31.棧的壓入、彈出序列
題目:輸入兩個(gè)整數(shù)序列,第一個(gè)序列表示棧的壓入順序,請(qǐng)判斷第二個(gè)序列是否為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均不相等。例如,序列{1,2,3,4,5}是某棧的壓棧序列,序列{4,5,3,2,1}是該壓棧序列對(duì)應(yīng)的一個(gè)彈出序列,但{4,3,5,1,2}就不可能是該壓棧序列的彈出序列。
32.從上到下打印二叉樹
題目1:不分行從上到下打印二叉樹
從上到下打印出二叉樹的每個(gè)節(jié)點(diǎn),同一層的節(jié)點(diǎn)按照從左到右的順序打印。例如,輸入下圖的二叉樹,則依次打印出8,6,10,5,7,9,11.二叉樹節(jié)點(diǎn)的定義如下:
struct BinaryTreeNode
{
int m_value;
BinaryTreeNode m_pLeft;
BinaryTreeNode m_pRight;
}
題目2:分行從上到下打印二叉樹
從上到下按層打印二叉樹,同一層的節(jié)點(diǎn)按從左往右的順序打印,每一層打印到一行。
題目3:之字形打印二叉樹
請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)按照之字形順序打印二叉樹,即第一行按照從左到右的順序打印,第二行按照從右往左的順序打印,第三行
33.二叉搜索樹的后序遍歷序列
題目:輸入一個(gè)整數(shù)數(shù)組,判斷該數(shù)組是不是某二叉搜索樹的后序遍歷結(jié)果。如果是則返回true,否則返回false。假設(shè)輸入的數(shù)組的任意兩個(gè)數(shù)字都互不相同。例如,輸入數(shù)組{5,7,6,9,11,10,8},則返回true,因?yàn)檫@個(gè)整數(shù)序列是下圖所示二叉搜索樹的后序遍歷結(jié)果。如果輸入的數(shù)組是{7,4,6,5},則由于沒有哪棵二叉搜索樹的后序遍歷結(jié)果是這個(gè)序列,因此返回false。
34.二叉樹中和為某一值的路徑
題目:輸入一棵二叉樹和一個(gè)整數(shù),打印出二叉樹中節(jié)點(diǎn)值的和為輸入整數(shù)的所有路徑。從樹的根節(jié)點(diǎn)開始往下一直到葉節(jié)點(diǎn)所經(jīng)過的節(jié)點(diǎn)行程一條路徑。二叉樹的定義如下:
struct BinaryTreeNode
{
int m_value;
BinaryTreeNode m_pLeft;
BinaryTreeNode m_pRight;
}
35.復(fù)雜鏈表的復(fù)制
題目:請(qǐng)實(shí)現(xiàn)函數(shù)ComplexListNode* Clone(ComplexListNode* pHead),復(fù)制一個(gè)復(fù)雜鏈表。在復(fù)雜鏈表中,每個(gè)節(jié)點(diǎn)除了有一個(gè)m_PNext指針指向下一個(gè)節(jié)點(diǎn),還有一個(gè)m_PSibilng指針指向鏈表中的任意節(jié)點(diǎn)或者nullptr。節(jié)點(diǎn)的定義如下:
struct ListNode
{
int m_value;
ListNode* m_pNext;
ListNode* m_pSibling
};
36.二叉搜索樹與雙向鏈表
題目:輸入一棵二叉搜索樹,將該二叉搜索樹轉(zhuǎn)換成一個(gè)排序的雙向鏈表。要求不能創(chuàng)建任何新的節(jié)點(diǎn),只能調(diào)整樹中節(jié)點(diǎn)指針的指向。例如,輸入下圖的二叉搜索樹,則輸出轉(zhuǎn)換之后的排序雙向鏈表。二叉搜索樹節(jié)點(diǎn)的定義如下:
struct BinaryTreeNode
{
int m_value;
BinaryTreeNode m_pLeft;
BinaryTreeNode m_pRight;
}
37.序列化二叉樹
題目:請(qǐng)實(shí)現(xiàn)兩個(gè)函數(shù),分別用來序列化和反序列化二叉樹。
38.字符串的排列
題目:輸入一個(gè)字符串,打印出該字符串中字符的所有排列。例如,輸入字符串a(chǎn)bc,則打印出由a、b、c所能排列出來的所有字符串a(chǎn)bc、acb、bac、bca、cab和cba。
拓展題1(未剔除重復(fù)組合)
題目:輸入一個(gè)字符串,打印出該字符串中字符的所有組合。例如,輸入字符串a(chǎn)bc,則它們的組合有a、b、吃c、ab、bc、abc。當(dāng)交換字符串中的兩個(gè)字符時(shí),雖然能得到兩個(gè)不同的排列,但卻是同一個(gè)組合。比如ab和ba是不同的排列,但只算是一個(gè)組合。
拓展題2
題目:將一個(gè)含有8個(gè)數(shù)字的數(shù)組,判斷有沒有可能把這8個(gè)數(shù)字分別放到正方體的8個(gè)定點(diǎn)上,使得正方體上三組相對(duì)的面上的4個(gè)定點(diǎn)的和都相等
拓展題3
題目:在8x8的國際象棋上擺放8個(gè)皇后,使其不能相互攻擊,即任意兩個(gè)皇后不得處在同一行、同一列或者同一條對(duì)角線上。下圖中的每個(gè)黑色格子表示一個(gè)皇后,這就是一種符合條件的擺放方法。請(qǐng)問總共有多少種符合條件的擺法。
39.數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字
題目:數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長度的一半,請(qǐng)找出這個(gè)數(shù)字。例如,輸入一個(gè)長度為9的數(shù)組{1,2,3,2,2,2,5,4,2}。由于數(shù)字2在數(shù)組中出現(xiàn)了5次,超過數(shù)組長度的一半,因此輸出2。
40.最小的k個(gè)數(shù)
題目:輸入n個(gè)整數(shù),找出其中最小的k個(gè)數(shù)。例如,輸入4、5、1、6、2、7、3、8這8個(gè)數(shù)字,則最小的4個(gè)數(shù)字是1、2、3、4。
41.數(shù)據(jù)流中的中位數(shù)
題目:如何得到一個(gè)數(shù)據(jù)流中的中位數(shù)?如果從數(shù)據(jù)流中讀出奇數(shù)個(gè)數(shù)值,那么中位數(shù)就是所有數(shù)值排序之后位于中間的數(shù)值。如果從數(shù)據(jù)流中讀出偶數(shù)個(gè)數(shù)值,那么中位數(shù)就是所有數(shù)值排序之后中間兩個(gè)數(shù)的平均值。
42.連續(xù)子數(shù)組的最大和
題目:輸入一個(gè)整形數(shù)組,數(shù)組里有正數(shù)也有負(fù)數(shù)。數(shù)組中的一個(gè)或者連續(xù)多個(gè)整數(shù)組成一個(gè)子數(shù)組。求所有子數(shù)組的和的最大值。要求時(shí)間復(fù)雜度為O(n)。
43. 1~n整數(shù)中1的出現(xiàn)的次數(shù)
題目:輸入一個(gè)整數(shù),求1n這n個(gè)整數(shù)的十進(jìn)制表示中1出現(xiàn)的次數(shù)。例如,輸入12,112這些整數(shù)中包含1的數(shù)字有1、10、11和12,1一共出現(xiàn)5次。
44.數(shù)字序列中某一位的數(shù)字
題目:數(shù)字以 0123456789101112131415...的格式序列化到一個(gè)字符序列中。在這個(gè)序列中,第5位(從0開始計(jì)數(shù))是5,第13位是1,第19位是4,等等。請(qǐng)寫一個(gè)函數(shù),求任意n位對(duì)應(yīng)的數(shù)字。
45.把數(shù)組排成最小的數(shù)
題目:輸入一個(gè)正整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來排成一個(gè)數(shù),打印能拼接出的所有數(shù)字中最小的一個(gè)。例如,輸入數(shù)組{3,32,321},則打印出這三個(gè)數(shù)字能排成的最小數(shù)字321323。
46.把數(shù)字翻譯成字符串
題目:給定一個(gè)數(shù)字,我們按照如下規(guī)則把它翻譯為字符串:0翻譯成”a“,1翻譯成”b“,...,11翻譯成”l“,...,25翻譯成”z“。一個(gè)數(shù)字可能有多少個(gè)翻譯,例如,12258有5中不同的翻譯,分別是”bccfi“、”bwfi“、”bczi“、”mcfi“、”mzi“。請(qǐng)編程實(shí)現(xiàn)一個(gè)函數(shù),用來計(jì)算一個(gè)數(shù)字有多少種不同的翻譯方法。
47.禮物的最大價(jià)值
題目:在一個(gè)m??n的棋盤的每一格都放有一個(gè)禮物,每個(gè)禮物都有一定的價(jià)值(價(jià)值大于0)。你可以從棋盤的左上角開始拿格子里的禮物,并每次向右或者向下移動(dòng)一格,直到到達(dá)棋盤的右下角。給定一個(gè)棋盤及其上面的禮物,請(qǐng)計(jì)算你最多能拿到多少價(jià)值的禮物。
48.最長不含重復(fù)字符的子字符串
題目:請(qǐng)從字符串中找出一個(gè)最長的不包含重復(fù)字符的子字符串,計(jì)算該最長子字符串的長度。假設(shè)子字符串中只包含'a'~'z'的字符。例如,在長字符串"arabcacfr"中,最長的不包含重復(fù)字符的子字符串是"acfr",長度為4。
49.丑數(shù)
題目:我們把只包含因子2、3、5的數(shù)稱作丑數(shù)。求按從小到大的順序的第1500個(gè)丑數(shù)。例如,6、8都是丑數(shù),但14不是,因?yàn)樗蜃?。習(xí)慣上我們把1當(dāng)做第一個(gè)丑數(shù)。
50.第一次只出現(xiàn)一次的字符
題目1:字符串中第一個(gè)只出現(xiàn)一次的字符
在字符串中找出第一個(gè)只出現(xiàn)一次的字符。如輸入”abaccdeff“,則輸出'b'。
相關(guān)題1
定義一個(gè)函數(shù),輸入兩個(gè)字符串,從第一個(gè)字符串中刪除在第二個(gè)字符串中出現(xiàn)過的所有字符。例如,從第一個(gè)字符串”We are students“中刪除在第二個(gè)字符串”aeiou“中出現(xiàn)過的字符得到的結(jié)果是”W r stdnts“。
相關(guān)題2
定義一個(gè)函數(shù),刪除字符串中所有重復(fù)出現(xiàn)的字符。例如,輸入”google“,刪除重復(fù)的字符之后的結(jié)果是”gole“。
相關(guān)題3
在英語中,如果兩個(gè)單詞出現(xiàn)的字母相同,并且每個(gè)字母出現(xiàn)的次數(shù)也相同,那么這連個(gè)單詞互為變位詞。例如,silent與listen、evil和live互為變位詞。請(qǐng)完成一個(gè)函數(shù),判斷輸入的兩個(gè)字符串是不是互為變位詞。
題目2:字符流中第一個(gè)只出現(xiàn)一次的字符
請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),用來找出字符流中第一個(gè)只出現(xiàn)一次的字符。例如,當(dāng)從字符流中只讀出前兩個(gè)字符”go“時(shí)。第一個(gè)只出現(xiàn)一次的字符是‘g’;當(dāng)從該字符流讀出前6個(gè)字符”google“時(shí),第一個(gè)只出現(xiàn)一次的字符是‘l’。
51.數(shù)組中的逆序?qū)?/h4>
題目:在數(shù)組中的兩個(gè)數(shù)字,如果前面一個(gè)數(shù)字大于后面的數(shù)字,則這兩個(gè)數(shù)字組成一個(gè)逆序?qū)Α]斎胍粋€(gè)數(shù)組,求出這個(gè)數(shù)組中的逆序?qū)Φ目倲?shù)。例如,在數(shù)組{7,5,6,4}中,一共存在5個(gè)逆序?qū)Γ謩e是(7,5)、(7,6)、(7,4)、(6,4)和(5,4)。
52.兩個(gè)鏈表的第一個(gè)公共節(jié)點(diǎn)
題目:輸入兩個(gè)鏈表,找出他們的第一個(gè)公共節(jié)點(diǎn)。鏈表節(jié)點(diǎn)定義如下:
struct ListNode {
int m_value;
ListNode* m_pNext;
}