原创 二叉樹搜索第k個節點(41)

題目 【給定一棵二叉搜索樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值爲4】 1、分析 二叉搜索樹的左子樹都小於根節點,右子樹都大於根節點。 且其中序遍歷剛好是

原创 不用加減乘除做加法(38)

題目 【寫一個函數,求兩個整數之和,要求在函數體內不得使用+、-、*、/四則運算符號】 1、分析 由於不能使用加減乘除,所以只能使用位運算來進行解決。將數字都轉換成二進制來進行位運算。 首先將兩個數字各位進行 異或 運算,此時

原创 醜數(23)

題目 【把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因爲它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數】 方法一: 1、分析 如果使用遍歷每個

原创 數組中只出現一次的數字(30)

題目 【一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。】 方法一:採用STL中的multiset 容器 1、分析 因爲數組中只有兩個數字只出現一次,其他數字都出現兩次,可以使用 mu

原创 滑動窗口的最大值(42)

題目 給定一個數組和滑動窗口的大小,找出所有滑動窗口裏數值的最大值。例如,如果輸入數組{2,3,4,2,6,2,5,1} 及滑動窗口的大小3,那麼一共存在6個滑動窗口,他們的最大值分別爲{4,4,6,6,6,5}; 針對數組{2,

原创 第一個只出現一次的字符(24)

題目一:字符串中第一個只出現一次的字符 【在一個字符串(0<=字符串長度<=10000,全部由字母組成)中找到第一個只出現一次的字符,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫)】 方法一:自建簡易hashTable

原创 圓圈中最後剩下的數字(36)

題目 【首先,讓小朋友們圍成一個大圈,小朋友的編號是從0到n-1。然後隨機指定一個數m,讓編號爲0的小朋友開始報數。每次喊到 m-1 的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,並且不再回到圈中,從他的下一個小朋友

原创 二叉樹的深度(28)

題目 【輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度爲樹的深度】 1、分析 二叉樹的深度爲其左右子樹的深度分別加上1(若左右子樹存在的話),然後用遞歸來處理。 2

原创 和爲s的連續正數系列(31)

題目 【輸出所有和爲S的連續正數序列(至少含有兩個數)。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序】 1、分析 由於數是連續的正數,且至少爲兩個數,所以最小的組合爲 [ 1 , 2 ],和最小爲3。可以使用兩個數

原创 構建乘積數組(40)

題目 1、分析 一種方法是分別連乘 n−1n-1n−1 個數字,得到 B[i],該方式的時間複雜度爲 O(n2)O(n^2)O(n2) ,並不是最好的方法。 改用另一種方式,由於 B[i]=A[0]∗A[1]∗⋅⋅⋅A[i−

原创 數字在排序數組中出現的次數(27)

題目一:數字在排序數組中出現的次數 【統計一個數字在排序數組中出現的次數。如 {1,2,3,3,3,3,4}和數字3,由於3出現的4,所以輸出4】 方法一:直接遍歷 1、分析 直接遍歷數組,由於數組已經排好序了,所以當數組中出現了

原创 連續子數組的最大和(20)

題目 1、分析 從數組的第一個數字開始加,當加上後一個數字之後和變成負數,則捨棄前面的數組,並將前面未變成負數的和保存給一個累加的值。說明子數組是從下一個元素開始的。然後從下一個元素開始重新往後加,並將暫時的和與之前保存的最大

原创 常用算法排序(04)—— 歸併排序

一、 歸併排序的基本思想 歸併排序是利用先遞歸進行分解,將一個規模爲 nnn 的問題分解成兩個規模爲 n/2n/2n/2 的問題,再不斷的繼續進行遞歸分解成最終規模爲111的問題。然後再逐漸的從小規模結果進行合併,最終得到完整的結

原创 求1+2+3+...+n(37)

題目 【求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)】 1、分析 可以通過將累加的方法放在類的構造函數中,然後創建類的n個對象,則會調用

原创 關於動態多態的錯題分析

C++中關於動態多態自己的理解仍然太淺了,對於多次在基類和派生類中來回調用的一些情況,仍然會產生動態多態的情況。 求如下程序的輸出結果: #include<iostream> #include<string> using name