劍指offer等算法總結歸類

從數據結構分java

一。鏈表:node

3.題目描述:輸入一個鏈表,從尾到頭打印鏈表每一個節點的值(遞歸)

思路:遞歸調用,調一次,加一次到list中正則表達式

14.題目描述:輸入一個鏈表,輸出該鏈表中倒數第k個結點

兩個指針,第一個先走k步,第二個不動,而後第一個和第二個一塊兒走,知道第一個到尾節點。數組

15.題目描述:輸入一個鏈表,反轉鏈表後,輸出鏈表的全部元素

思路,主要是調整指針。數據結構

16.題目描述:輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,固然咱們須要合成後的鏈表知足單調不減規則

思路:兩個鏈表先比較頭,頭比較小的作新鏈表的頭,新鏈表的next遞歸調用本函數。app

25.題目描述:輸入一個複雜鏈表(每一個節點中有節點值,以及兩個指針,一個指向下一個節點,另外一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。(注意,輸出結果中請不要返回參數中的節點引用,不然判題程序會直接返回空)

思路:三步走。第一步:鏈接到後面。第二步:構建隨機指針。第三部:拆除鏈接函數

最後記得把pClonedNode賦值給一個pClonedHead保存頭結點。用於最後的返回。測試

26.題目描述:輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能建立任何新的結點,只能調整樹中結點指針的指向。

見第四。ui

36.題目描述:輸入兩個鏈表,找出它們的第一個公共結點。

思路:分別遍歷兩個鏈表,獲得他們的長度差,而後長鏈表走這個差值的步數。而後長鏈表和短鏈表一塊兒走,直到它們碰到,返回。spa

55.題目描述:一個鏈表中包含環,請找出該鏈表的環的入口結點。

思路:用兩個指針,一個快指針一下走兩步,一個慢指針,一下走一步。而後走着直到它們相遇。而後把慢指針從頭走,快指針一步一步走,直到它們相遇就是環的入口節點。

56.題目描述:在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5

思路:特別要注意須要保存節點到一個ListNode中,以防後面修改移動後找不到指針。須要Pre節點一個。指向前一個節點,pNode指向當前節點。因爲當前節點的前一個是沒有的,因此建立一個頭節點val爲-1.而後把它指向node。

二。數組

1.題目描述:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

思路:從最右邊最上邊開始比較,target比之大,row++;比之小,col--,不然返回true

6. 題目描述:把一個數組最開始的若干個元素搬到數組的末尾,咱們稱之爲數組的旋轉。輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。NOTE:給出的全部元素都大於0,若數組大小爲0,請返回0。

思路:本題考查二分查找。兩個下標,一頭一尾,循環條件是while(array[index1]>=array[index2])循環結束條件是index2-index1==1.循環的過程當中要不停的建立數組的重點,不停的去二分查找,若是中點值大於等於前半部分(隱含的條件是大於第二部分),那麼中點的值就位於第一部分,第一部分的下標就要變換爲mid。同理,若是中點值小於第一部分而且小於等於第二部分,那中點值必定位於第二部分,對於特殊狀況,如// 3 3 3 0 3, 3 0 0 0 3兩種狀況沒法判斷哪一個屬於旋轉部分。就須要經過普通的辦法來查找。

13題目描述:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得全部的奇數位於數組的前半部分,全部的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

思路1:藉助一個輔助數組,遍歷第一遍把奇數放進去,第二遍把偶數放進去,再傳遞給原來的數組。

思路2:待思考

28.題目描述:數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。因爲數字2在數組中出現了5次,超過數組長度的一半,所以輸出2。若是不存在則輸出0。

思路:遍歷數組的時候保存兩個值,一個是數組中的一個數字,另外一個是次數。但咱們遍歷到下一個數字的時候,若是下一個數字和咱們以前保存的數字相同,次數加一,不一樣次數減一:若是次數爲0,那麼咱們須要保存下一個數字,並把次數設爲1,有與咱們要找的數字出現的次數比其餘的數字次數之和還要多,MAME要找的數字確定是最後一次吧次數設爲1對應的數字。另外要驗證該數字是否大於長度的一半。

29.題目描述:輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,

思路:快排+二分查找

30.題目描述:HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同窗。今天測試組開完會後,他又發話了:在古老的一維模式識別中,經常須要計算連續子向量的最大和,當向量全爲正數的時候,問題很好解決。可是,若是向量中包含負數,是否應該包含某個負數,並指望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和爲8(從第0個開始,到第3個爲止)。你會不會被他忽悠住?(子向量的長度至少是1)(連續子數組的最大和)

思路:兩個變量,一個存當前的和,另外一個存最大值,而後遍歷數組,若是curSum小於0,就等於當前數組的值,不然就curSum+=num【i】,若是curSum比max大的話就更新。

32.題目描述:輸入一個正整數數組,把數組裏全部數字拼接起來排成一個數,打印能拼接出的全部數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。

思路:主要是考察對比較器的認識,比較器裏面定義兩個字符串,用字符串自帶的比較器比較便可。要比較的對象是o1+o2與o2+o1兩個字符串。

35.題目描述:在數組中的兩個數字,若是前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007

思路:參考歸併排序。

 

37.題目描述:統計一個數字在排序數組中出現的次數。

思路:改進的二分查找,注意等於的時候還要看狀況移動指針,覺得不必定是恰好是邊界。

40.題目描述:一個整型數組裏除了兩個數字以外,其餘的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。

思路:全部數組元素的異或結果就是兩個出現一次的數字的異或結果,因此把這兩個數字分別劃分到兩個數組裏,每一個數組的異或結果就是這個數,劃分規則是根據第一次出現1的位數那一位是0仍是1。例如數組{2,4,3,6,3,2,5,5}異或的結果是0010,咱們就根據倒數第二位是0仍是1來劃分。注意位數是從後往前的。

41.題目描述:小明很喜歡數學,有一天他在作數學做業時,要求計算出9~16的和,他立刻就寫出了正確答案是100。可是他並不知足於此,他在想究竟有多少種連續的正數序列的和爲100(至少包括兩個數)。沒多久,他就獲得另外一組連續正數和爲100的序列:18,19,20,21,22。如今把問題交給你,你能不能也很快的找出全部和爲S的連續正數序列? Good Luck!

思路:有點相似二分查找或者partition過程,不一樣的是,兩個指針一個是從頭開始,另外一個從第二個元素開始。記錄small+big的和爲cursum,若是這個值等於要求的sum和的話,那麼就找到一個,small++;若是小於sum那麼big++,cursum也要加上big處的數,大於的話small也要++,可是cursum要把small去掉,這個時候可能就到了邊界,注意此處的邊界是mid=()sum+1)/2,從1和2開始循環

42.題目描述:輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,若是有多對數字的和等於S,輸出兩個數的乘積最小的。

思路:準備兩個指針,一個指向頭,一個指向尾,而後若是頭的值和尾的值的和與要找的數相等的話就找到了,而後再找伺機最小的,注意指針的移動。若是不等,那麼 若是和大於num,那麼後面的指針前移,小於前面的指針後移。

50.題目描述:在一個長度爲n的數組裏的全部數字都在0到n-1的範圍內。 數組中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每一個數字重複幾回。請找出數組中任意一個重複的數字。 例如,若是輸入長度爲7的數組{2,3,1,0,2,5,3},那麼對應的輸出是重複的數字2或者3。

思路:由於數組中的數字是從0-n-1,排序後每一個數字和它對應的下標相等,所以咱們能夠遍歷數組若是和下標不對應,就交換直到對應。

51.題目描述:給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...*A[i-1]A[i+1]...*A[n-1]。不能使用除法。

思路:不妨定義C【i】=A[0]*A[1]*...A[I-1],D[I]=A[i+1]*...A[n-2]*A[N-1]。c能夠自上而下的順序計算出來,即C【i】=C[I-1]*A[I-1],D能夠經過自下而上計算出來,即D【i】=D【i+1】*A【i+1】;

從代碼上看,第一個正序,第二個從後往前,注意第二次計算順帶把第一個的帶進去了,result數組的最後一個值和C數組的最後一個值是相等的,看圖就明白了。

64.題目描述:給定一個數組和滑動窗口的大小,找出全部滑動窗口裏數值的最大值。例如,若是輸入數組{2,3,4,2,6,2,5,1}及滑動窗口的大小3,那麼一共存在6個滑動窗口,他們的最大值分別爲{4,4,6,6,6,5}; 針對數組{2,3,4,2,6,2,5,1}的滑動窗口有如下6個: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

思路:以{2,3,4,2,6,2,5,1}分析,主要要用到雙端隊列,在java中就是linkedList,數組的第一個數字是2,存入隊列。第二個數字是3,因爲它比前一個數字2大,所以2不可能成爲滑動窗口的最大值。先把2從隊列裏刪除,再把3存入隊列。何時結束呢,當一個數字的下標與當前處理的數字的下標之差大於或者等於滑動窗口的大小時,這個數字已經從窗口劃出,能夠從隊列中刪除了。

 

45.題目描述:從撲克牌中隨機抽5張牌,判斷是否是一個順子,即這五張牌是否是連續的。A爲1,J爲11,大小王能夠當作是任意數字。

 思路:分三步,1:把數組排序;2.統計數組中0的個數;3.統計排序以後的數組中相鄰數字之間的空缺總數。注意出現對子直接返回false。

三。字符串

2.題目描述:請實現一個函數,將一個字符串中的空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy

思路:從後往前,設一個新的strbuilder,新str的長度是原來的長度+空格長度*2;從後往前挨着替換。因爲是在原有的sb上替換,因此只能從後往前。須要兩個下標,分別從後往前,新的下標三部頂舊下標的一步。已遠數組的大小進行循環。

27.題目描述:輸入一個字符串,按字典序打印出該字符串中字符的全部排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的全部字符串abc,acb,bac,bca,cab和cba。

思路:暴力遞歸。不停的去切換下標(下一個字符),而後遞歸調用。遞歸終止的條件是下標到了length-1.最後集合裏沒有的有的話再添加。(相似的題,求子序列,思路也是找下一個,能夠選擇加仍是不加這個字符串)

34.題目描述:在一個字符串(1<=字符串長度<=10000,所有由字母組成)中找到第一個只出現一次的字符,並返回它的位置。若是字符串爲空,返回-1

一個哈希表,沒有的話置爲1,有的話+1,最後找等於1的。

43.題目描述:彙編語言中有一種移位指令叫作循環左移(ROL),如今有個簡單的任務,就是用字符串模擬這個指令的運算結果。對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。例如,字符序列S=」abcXYZdef」,要求輸出循環左移3位後的結果,即「XYZdefabc」。是否是很簡單?OK,搞定它!

思路:主要是一個頭尾互換函數不停的調用。先總體調用。而後分出的兩塊分別調用。

44.題目描述:牛客最近來了一個新員工Fish,天天早晨老是會拿着一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,「student. a am I」。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是「I am a student.」。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?

思路:與上題有點像,一樣是字符串翻轉的應用。

49.題目描述:將一個字符串轉換成一個整數,要求不能使用字符串轉換整數的庫函數。 數值爲0或者字符串不是一個合法的數值則返回0

注意:思路是result=result*10+c-'0';可是要注意第一個字符有正負號的狀況,下標要移動,若是第一個是+或者-可是長度只有1也要返回0;遍歷的過程當中也要判斷是否在0-9中間。

52.題目描述:請實現一個函數用來匹配包括'.'和''的正則表達式。模式中的字符'.'表示任意一個字符,而''表示它前面的字符能夠出現任意次(包含0次)。 在本題中,匹配是指字符串的全部字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,可是與"aa.a"和"ab*a"均不匹配。

思路:主要分爲兩種狀況:模式的第二個字符(1)是*(2)第二個不是*,而後再分狀況遞歸調用,移動下標。

53.題目描述:請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 可是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

正則表達式瞭解一下

65.題目描述:請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串全部字符的路徑。路徑能夠從矩陣中的任意一個格子開始,每一步能夠在矩陣中向左,向右,向上,向下移動一個格子。若是一條路徑通過了矩陣中的某一個格子,則該路徑不能再進入該格子。 例如[a b c e s f c s a d e e]是3*4矩陣,其包含字符串"bcced"的路徑,可是矩陣中不包含「abcb」路徑,由於字符串的第一個字符b佔據了矩陣中的第一行第二個格子以後,路徑不能再次進入該格子。

思路:回溯法,不停的往前走兩層循環,裏面用遞歸,回溯,分別取i-1,i+1,j-1,j+1,k取下一個字符,暴力遍歷,便可,若是訪問成功記得修改flag

四。二叉樹,二叉搜索樹

4.題目描述:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回(遞歸)

思路:先把中序遍歷的下標,健爲中序中的數字,值爲下標放入hashmap中。主要是下標變換.先創建根節點,root.left=遞歸調用。root.rigth=遞歸調用。

方法中的參數有(pre,pi,pj,ni,nj)index=map.get(pre[pi]).left=(pre,pi+1,pi+index-ni,ni,index-1) right=(pre,pi+index-ni+1,pj,index+1,nj)

17.題目描述:輸入兩棵二叉樹A,B,判斷B是否是A的子結構。(ps:咱們約定空樹不是任意一個樹的子結構)

思路:先判斷根是否相等,相等的話再比較左孩子和右孩子,左右的比較確定是遞歸。固然不是的話,咱們還要把左孩子和root2樹作一樣的對比。

18.題目描述:操做給定的二叉樹,將其變換爲源二叉樹的鏡像。

遞歸,左右孩子互換,而後調用本身的方法直到終止條件。

22.題目描述:從上往下打印出二叉樹的每一個節點,同層節點從左至右打印。

思路:把節點放一個隊列裏(linnkedList)有左子樹就把左子樹放入,有右子樹就把右子樹放入隊列,而後再依次彈出,入隊和出隊是同在一個循環裏面的。出隊的時候放入ArrayList中。,要是有左右孩子就要把左右孩子依次放入隊列。總體看就是出隊的時候伴隨着入隊。出隊的元素就是之前入隊造成的。

23.題目描述:輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。

思路:整體是遞歸思路。首先要想清楚二叉搜索樹的性質:全部的左子樹的值小於根節點的值,全部的右子樹的值大於根節點。後序遍歷的特色是:根節點在最後。

因而從頭開始遍歷,直到找到第一個數比根節點大的值的下標,若是以後的值有比根節點小的那麼直接返回false。if(i>start)遞歸左子樹 isPostBST(sequence,start,start+i-1);if(j<end) isPostBST(sequence,start+i,end-1);

24.題目描述:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和爲輸入整數的全部路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所通過的結點造成一條路徑。

思路:整體遞歸思路。兩個ArrayList一個放全部路徑,一個放一條當前路徑。須要用到遞歸,每當到葉子節點時候就要判斷是否等於target,target遞歸的過程當中不停的變換,findPath(root,target)target不不停的減去root值。開始的時候要把root.val放進去。最後到葉子節點記得把road(當前路徑的list)的最後一個元素刪掉(若是等於已經添加進roads裏面了,若是沒有找到就把最後一個值捨去,而後返回上一層節點)

26.題目描述:輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能建立任何新的結點,只能調整樹中結點指針的指向。

思路:要注意點一點是要把T初始的TreeNode賦值給一個變量Head。而後遞歸調用,左節點去找,有節點去找。而後找到左孩子的最右邊節點和右孩子最左邊節點。而後把根節點和左孩子最右節點相連,右孩子最左和根節點相連。最後返回Head。

38.題目描述:輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次通過的結點(含根、葉結點)造成樹的一條路徑,最長路徑的長度爲樹的深度。

思路:遞歸。哪一個孩子的深度大,就把這個深度加上本身自己的1,就是實際的深度。

39.題目描述:輸入一棵二叉樹,判斷該二叉樹是不是平衡二叉樹。

思路:與上題思路基本相同。可是要加上一句,if左右孩子深度差超過1,那麼return false。

57.題目描述:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點而且返回。注意,樹中的結點不只包含左右子結點,同時包含指向父結點的指針。

思路:一個節點若是有右孩子,那麼它的中序遍歷的下一個節點就是它的右孩子的最左邊的節點,若是沒有右孩子,它的中序遍歷的下一個節點就須要:經過next向上遍歷直到它是它父節點的左孩子爲止。

58.題目描述:請實現一個函數,用來判斷一顆二叉樹是否是對稱的。注意,若是一個二叉樹同此二叉樹的鏡像是一樣的,定義其爲對稱的。

思路:準備兩棵如出一轍的樹,這個題來講就是第一顆樹的左孩子和第二課樹的左孩子對稱而且,第一棵樹的右孩子和第二棵樹的左孩子對稱。而後遞歸,注意跳出循環的條件。

59.題目描述:請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其餘行以此類推。

思路:準備兩個棧(linkedList或者Stack),一個放正序TreeNode,另外一個放逆序TreeNode,正序彈出來的時候,按從左到右的順序壓入,而後逆序棧彈出的就是逆序,而後按從右往左的順序壓棧,兩個棧相互交替完成。而後每次循環須要一個list。用來添加一行的數字。(注意循環條件,當任意一個不爲空就能夠循環)

60.題目描述:從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

思路:與上一題有點像,不一樣的是此處只須要一個數據結構,一個隊列便可。須要準備一個num遍歷存儲隊列的大小,當num>0時候要不停的出隊,固然出隊的同時它的孩子也要分別入隊。其餘操做基本相同。另外,隊列使用linkedList。(隊列和棧均可以使用)

61.題目描述:請實現兩個函數,分別用來序列化和反序列化二叉樹

思路:序列化是TreeNode到String字符串的過程,反序列化反之。注意用先序遍歷。

序列化:遞歸調用,String res=root.val+",";res+=serialize(root.left) ;res=serialize(root.right);遞歸終止條件是root==null 此時要把"#,"返回。

反序列化:一樣遞歸,首先要經過「,」分隔爲一個字符串數組,而後用一個下標index表示字符串的下標,經過下標的不停移動來遞歸調用。TreeNode node=new TreeNode(Integer.parseInt(s[index])),遞歸終止條件是 if(s[index]=="#") return null,而且index++;

62.題目描述:給定一顆二叉搜索樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值爲4。

思路:整體思路是中序遍歷,左中右,而後遞歸,左邊若是找到了那麼return,右邊找到了右邊return。中間是index++;而後if(index==k)return pRoot;

五。棧,隊列

5.題目描述:用兩個棧來實現一個隊列,完成隊列的Push和Pop操做。 隊列中的元素爲int類型。

思路:push直接進第一個棧,出棧的話,若是stack2不爲空纔出,爲空的話就把stack1以此pop彈出並壓入2.

20.題目描述:定義棧的數據結構,請在該類型中實現一個可以獲得棧最小元素的min函數。

 思路:準備兩個棧,第一個放其餘元素,第二個放最小元素,push過程當中,若是minStack爲空或者新元素比minStack的棧頂元素小,則把新元素push進去,而後把新元素push進第一個棧。pop過程當中,若是第一個棧彈出的元素和minStack的棧頂元素相同,則須要把minStack元素和第一個棧的元素一併彈出。

獲取最小值的操做就是minStack.peek()。

21.題目描述:輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的全部數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不多是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

思路:準備一個輔助棧。先壓入第一個要壓入的元素。若是下一個要彈出的元素不等於棧頂,則要壓棧,直到找到下一個要彈出的元素,若是下一個要彈出的元素等於棧頂元素,直接pop彈出。若是到最後都沒找到就返回false。要注意兩個下標:一個是pop數組的,這個是整個for循環的下標,另外一個是push數組的下標,這個index是push數組有沒有到頭的一個標誌。

六。二級制玩法

11.題目描述:輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。

思路:一個數和這個數減去1取與的次數就是二進制1的個數。

七。矩陣

19.題目描述:輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每個數字,例如,若是輸入以下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

 思路:start爲起點,因爲起點始終都是0,0或者1,1這種,至關於0,0的位置,注意循環條件是rows>start*2&&cols>start*2,向下打印的時候,須要加入判斷:endY>start,向左的時候:endY>start&&endx>start 向上的時候:endy>start+1&&endx>start。另外須要注意的是,轉一圈,也就是循環一次,start要加一。而且每次endx=cols-1-start,endy=rows-1-start;

65.題目描述:請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串全部字符的路徑。路徑能夠從矩陣中的任意一個格子開始,每一步能夠在矩陣中向左,向右,向上,向下移動一個格子。若是一條路徑通過了矩陣中的某一個格子,則該路徑不能再進入該格子。 例如[a b c e s f c s a d e e]是3*4矩陣,其包含字符串"bcced"的路徑,可是矩陣中不包含「abcb」路徑,由於字符串的第一個字符b佔據了矩陣中的第一行第二個格子以後,路徑不能再次進入該格子。

思路:見字符串分類裏面。

 

51.題目描述:給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...*A[i-1]A[i+1]...*A[n-1]。不能使用除法。

 思路:見數組

 

 八。堆

63.題目描述:如何獲得一個數據流中的中位數?若是從數據流中讀出奇數個數值,那麼中位數就是全部數值排序以後位於中間的數值。若是從數據流中讀出偶數個數值,那麼中位數就是全部數值排序以後中間兩個數的平均值。

 

九,醜數

 

33.題目描述:把只包含素因子二、3和5的數稱做醜數(Ugly Number)。例如六、8都是醜數,但14不是,由於它包含因子7。 習慣上咱們把1當作是第一個醜數。求按從小到大的順序的第N個醜數。

思路:二、三、5分別有本身的一個下標,每個醜數都是另外一個醜數乘以2/三、或者5。要用本身下標處的值乘以本身的2/三、或者是5,而後找他們中間的最小值放入list中,若是這個最小值和剛纔獲得的數字相等的話,那麼下標就++。

須要的輔助空間:三個num保存有可能進入到list中的醜數,三個index保存2/3/5的下標,一個Arraylist保存結果。

相關文章
相關標籤/搜索