作者:ShawnNg
鏈接:https://www.nowcoder.com/discuss/33737
來源:牛客網
編程題
- 1~n這n個數現在去掉兩個,如何找到去掉的兩個數。 假設去掉的兩個數是a和b,那么通過求和,平方和可以知道a+b和a^2+b^2,然后解方程就行了。
- char a[4] = {1, 2, 3, 4}; char *b = a; b[0] = 100; 請問輸出a的結果是什么?
- 一個 N*M 的矩陣,從左上走到右下最小需要(N+M)步走完,問一共有多少種走法。
- 一個嚴格遞增的數組,將前綴取一部分放在后面,在修改后的數組上找到最小的數。(劍指Offer原題)
- 一個大寫字符串如ABABB(len<1000),代表游客進游樂場的順序及從哪個入口進入,要求每個入口(不多於26個入口)從第一個游客直到該入口的最后一個游客,檢票員都不能離開,問最少檢票人數K。
- 一個字符數組中,每個字符都出現了3次,只有一個出現了2次,如果快速找出這個出現2次的?
- 一個字符矩陣,只可能是R,G,B三種字符。判斷是否滿足某個條件。這個條件是每種符號連成一個長方體,三個長方體長寬一致,且橫着平行
- 一個廣告,它有一個id,一個上線時間,一個下線時間,現在我有很多這樣的廣告,如果現在給你一個時間,告訴我有多少個廣告在這個時間在線的
- 一個數據流中,如何采樣得到100個數,保證采樣得到的100個數是隨機的?
- 一個數組中某個數出現次數大於一半,最快找出該數。
- 一個數組只有一個數字是單獨出現,其他出現了三次。
- 一個數組存着1-1000連續的整數,假如我取出其中一個數,怎么能快速找到(用類二分查找)
- 一個數組存着負數與正數,將正數放在前面,負數放在后面
- 一個運算序列只有+、*、數字,計算運算序列的結果。(Code)
- 一堆ip地址區間,不會重疊,來一個新的ip地址,看它在不在,在哪個區間。
- 一維數組,swap 其中的幾對數字(每個數字只屬於一次 swap 操作),實現查找(與二分有關);
- 一維有序數組,經過循環位移后,最小的數出現在數列中間,如果原數組嚴格遞增或遞減,如何找這個最小數;
- 一維有序數組,經過循環位移后,最小的數出現在數列中間,如果原數組嚴格遞增,如何找這個最小數。
- 一維有序數組,經過循環位移后,最小的數出現在數列中間,如果原數組非嚴格遞增或遞減,如何找這個最小數;
- 一維有序數組,經過循環位移后,最小的數出現在數列中間,數組可能是遞增、遞減、遞減后遞增、遞增后遞減四種情況,遞增遞減都是非嚴格的,如果有轉折點,返回轉折點的值,否則返回-1;
- 一道題:給定一個整數數組,里面有兩個數相同,其他數都是不同的,如何盡快找到這兩個數(答,用hash表,O(N),有更好的方法么?)
- 一題是多位數用鏈表存儲( e.g. 123 用 1->2->3 存儲),實現相加功能函數
- 不創建臨時產量換兩個數
- 兩個同樣大小有序數組求中位數,寫代碼
- 兩個大整數相乘。(Code)
- 兩棵樹相加——對應位置兩棵樹都有值則相加,對應位置只有一棵樹有值則取該值;
- 中序遍歷二叉樹,利用O(1)空間統計遍歷的每個節點的層次。(Bug Free Code)
- 中綴表達式轉逆波蘭表達式,逆波蘭表達式求值;
- 為分析用戶行為,系統常需存儲用戶的一些 query ,但因 query 非常多,故系統不能全存,設系統每天只存 m 個 query ,現設計一個算法,對用戶請求的 query 進行隨機選擇 m 個,請給一個方案,使得每個 query 被抽中的概率相等,並分析之,注意:不到最后一刻,並不知用戶的總請求量。
- 二分查找
- 二分查找,查找target,在區間[start,end]之間,如果有重復元素,返回最后一個下標,其他情況返回-1
- 二叉樹前序遞歸遍歷算法(手寫代碼)
- 二叉樹的前中后遍歷
- 二叉樹的文件存儲,也就是序列化。
- 二叉樹遍歷,描述下層序遍歷。
- 二維數組,每行遞增,每列遞增,任意交換其中的兩數,發現並恢復。
- 二維數組,每行遞增,每列遞增,實現查找。
- 二維數組,每行遞增,每列遞增,求第k大的數。
- 什么樣的數據結構可以滿足多次插入刪除,取最小數,給出時間復雜度。
- 介紹二叉樹前序遍歷非遞歸遍歷算法(手寫代碼)
- 介紹大頂堆和小頂堆
- 從一組數中找出和為sum的三個數(leetcode原題,先sort再找,並且剪枝),寫代碼,四個數呢?說思路。
- 假設有個M*N的方格,從最左下方開始往最右上方走,每次只能往右或者往上,問有多少種走法,假設中間有若干個格子不能走,又有多少種走法。
- 允許兩個元素交換一次的最大連續子序列和。
- 全排列
- 全排列。
- 冒泡排序(手寫代碼)
- 寫 find 函數,在目標串中匹配模式串(要考慮中文字符的情況)
- 寫一個二叉樹的非遞歸的后續遍歷
- 寫一個簡單的正則匹配表達式(將文本中的123.4匹配出來)
- 寫個動態規划,最長公共子序列
- 判斷一個字符串是否為另外一個字符串旋轉之后的字符串
- 前k大的數
- 單鏈表的翻轉
- 去掉連續的重復數字,輸出新數組,例如:1,2,2,2,1,3,5——> 3,5。
- 去除字符串S1中的字符使得最終的字符串S2不包含’ab’和’c’。(Code)
- 合法括號匹配
- 在一個字符串中,找出最長的無重復字符的字串
- 在二叉樹結點結構中加一個指針域,使其指向層次遍歷的下一個結點,特別地,每一層的最后一個結點為空。(Code)
- 堆排序(手寫代碼)
- 堆是怎么調整的。
- 復雜鏈表的復制。
- 如果給出一個二叉搜索樹的后續能不能建立(可以,因為只要將遍歷結果排序就可以得到中序結果)。
- 字符串反轉(手寫代碼)
- 字符串移位,給出字符串abc##dfg##gh,實現將所有#移至字符串串頭。輸出####abcdfggh。
- 字符串轉整數
- 字符串,給一個url,求中間的site
- 字符串,給一個url,求中間的site。
- 定義滿足$n=x^a+y^b$($x,y,a,b$是非負整數)的n是神奇數。如$4 = 2^0 + 3^1,17 = 2^3 + 3^2$。輸入l和r,請求出閉區間$[l,r]$里,最長的一段不含有神奇數的連續區間長度。$x,y,l,r<=10^{18},x>=2,y>=2$,如$3\ 5\ 10\ 22$,在$[10,22]$區間內,$x=3,y=5$的條件下,區間內[14]是神奇數,所以最長的區間是$[15,22]$長度為$8$,如$2,3,1,10$,在$[1,10]$區間內,$x=2,y=3$的條件下,$2,3,4,5,7,9$都是神奇數,所以最長的區間只有長度$1$。
- 實現棧,使得 添加、刪除、max 操作的復雜度為 O(1)。
- 對於一個字符串,請設計一個算法,只在字符串的單詞間做逆序調整,也就是說,字符串由一些由空格分隔的部分組成,你需要將這些部分逆序。給定一個原字符串A和它的長度,請返回逆序后的字符串。
- 對於一個字符串,請設計一個算法,將字符串的長度為len的前綴平移到字符串的最后。
- 尋找字符串中第一個只出現一次的字符;
- 將字符串連續重復出現的字符刪到只剩一個,這個可以用雙指針,時間復雜度n,空間復雜度1。
- 常用排序算法的時間和空間復雜度
- 平衡二叉樹是什么
- 歸並排序(手寫代碼)
- 快速排序(手寫代碼)
- 快速排序+二分查找
- 手寫快排(easy)
- 打印數組的組合數。
- 打印螺旋數組;
- 把一個bst轉化成一個雙向鏈表。
- 把一個字符串的大寫字母放到字符串的后面,各個字符的相對位置不變,不能申請額外的空間。例如AbcDeFGhi ->bceiADFG
- 排序二叉樹轉雙向鏈表。(Code)
- 描述Dijkstra最短路徑算法
- 插入排序(手寫代碼)
- 數列中找第 k 大的數字(與快排或堆排序有關)
- 數據解壓縮,3(a4(ab)) -> aababababaababababaabababab;
- 數組有只有一個數出現一次,其他數都出現三次,找出那個數。
- 旋轉數組
- 最少時間復雜度求數組中第k大的數。(Code)
- 最短路徑代碼。
- 最長公共子串(動態規划有關);
- 最長公共子序列
- 有一堆無向好友列表 1-2, 3-4, 2-3 之類的,問能不能把這些用戶划分兩組,組內都不互為好友。
- 有序數組尋找和為某數的一對數字;
- 正數數組,找三個數使積最小,問有多少種選擇。
- 母雞、公雞和小雞問題:公雞五塊一只,母雞三塊一只,小雞一塊三只,用100元買100只雞的所有方法。
- 求double類型的二進制1的個數。
- 求二叉樹最近公共祖先(leetcode原題)
- 求連續子數組最大乘積,還讓考慮邊界問題(最后問了:連乘有可能導致溢出,存不下了)
- 用一個隊列,將每個二叉樹的root先放入隊列。
- 用數組實現隊列,各操作的復雜度分析。
- 用速度不同的指針可以判斷鏈表中是否有環,問兩速度滿足怎樣的關系可以保證發現環。
- 直接插入排序寫代碼
- 看段代碼,問輸出是啥。(就是段求二進制中1的個數)
- 矩陣求最長連續遞增的路徑長度
- 矩陣求最長連續遞增的路徑長度。
- 第一題是鏈表倒數第 k 節點;第二題是二叉樹打印路徑,第三題是矩陣中將 0 元素所在行列全置 0 的最優空間解法
- 第二輪是寫出一個算法輸出二叉樹的 s 序列,何為 s 序列,比如現在有個二叉樹 1-2,3-4,5 6,7 這是一顆完全二叉樹, S 序列輸出就是按照 1237654 這個順序輸出,用兩個棧就能實現比較簡單。
- 算法題,也只記得一個了:存在一個數組,大小98,里面的元素均為在[1,100],且無重復, 不申請額外空間的情況下,在時間復雜度為O(N)情況下,找出缺失的兩個元素值。
- 給一個n*n的矩陣,矩陣中滿足每行每列都是遞增的,要查找矩陣是否存在某個數.(leetcode原題)
- 給一個數組,只有一個元素出現了一次,其他都出現了兩次,找出出現一次的數。
- 給一個數組,數組種存在一種數,它的左邊都比它小,右邊都比它大,找出所有這些數的位置。
- 給一個股票,n天的價格,只能兩次買入賣出,而且只能只能先賣再買,問最多賺多少錢?
- 給一個股票,n天的價格,只能進行一次買入和賣出,問最多賺多少錢?
- 給一個股票,n天的價格,可以買入賣出k次,而且只能只能先賣再買,問最多賺多少錢?
- 給一個股票,n天的價格,可以無限次買入賣出,問最多賺多少錢?
- 給了一個鏈表,第1個結點標號為1,把鏈表中標號在M到N區間的部分反轉。
- 給你一個無重復的數組輸出全排列。
- 給你一顆二叉樹按層輸出每一層輸出后都換行
- 給出一個二維矩陣,從(0,0)出發走到右下角,只能向右或向下走,找到一條路徑,是這條路徑上的總和最大。
- 給出一段代碼問代碼作用(二進制數據1的個數)
- 給出一顆二叉樹,兩個葉節點,找到這兩個葉節點互連通的一條最短路徑。
- 給定一個數組,只有一個元素出現了一次,其他都出現了3次,找出出現一次的數。
- 給定一個數組,有兩個元素出現了一次,其他都出現了兩次,找出兩個出現一次的數。
- 給定一個正整數向量,判斷這個向量是否存在一個片段,使得反轉這個片段后能夠使該向量升序排列。如:[1, 2, 4, 3],就可以通過反轉[4, 3]使得向量變為[1, 2, 3, 4]。
- 給定二叉樹的先序跟后序遍歷,能不能將二叉樹重建(不能,因為先序:父節點-左節點-右節點,后序:左節點-右節點-父節點,兩者的拓撲序列是一樣的,所以無法建立)
- 給定循環遞增數組 $a=[7,8,9,1,2,3]$和一個值$k=2$,返回該值得再數組中的下標。
- 給定數組A[]={1,4,7,...}和一個數T。求和為T的A中的數最少要幾個。A中的數可復用。 我寫了個遞歸,面試官不建議使用,因為效率不高。但沒有反對。
- 給定數組,尋找 next big(堆排序有關);
- 給我一個數組[1,2,5,10,20,50,100],可以從里面取若干個數,要求得出和為100的不同取法有多少?(說出思路)
- 統計數列中的逆序對(歸並排序有關);
- 編程題:實現求正整數平方根整數部分的函數(使用梯度下降)
- 翻轉二叉樹(Code)
- 若干個二叉樹,如何按照層序遍歷
- 設 rand ( s , t )返回 [s,t] 之間的隨機小數,利用該函數在一個半徑為 R 的圓內找隨機 n 個點,並給出時間復雜度分析。
- 輸入一個大長方形,長寬ab,和一堆小長方形。選擇兩個小長方形,它能放進大長方形,而這個小長方形面積和最大
-
輸入一個宿舍樓亮燈描述圖,計算把所有燈關掉的最短時間,管理員起點在左下角,只能在最左或最右的樓梯往上一層,不可往下一層。每次往上一層花費1分鍾,每次往左或往右一間宿舍花費1分鍾,關燈不花時間。輸入的高<=15,寬<=100。
如圖:0010 0100 從左下角開始,最短花費時間是先往右(關燈),再往左,再上一層,再往右兩次(關燈)完成:5
再如:
001000 000010 000010 最短時間是先往右四次(關燈),往右一次,上一層,往左一次(關燈),往右一次,上一層,往左三次(關燈),完成,12
- 輸入兩個正數數組,在兩個數組分別選一個數,要求第一個數組選的數的下標小於第二個數組選的數的下標。使得兩個數的乘積最大。
- 輸出字符串中的所有重復子串,例如:abcab,輸出: a, b, ab
- 連續子數組最大和
- 迷宮的深度搜索、廣度搜索;
- 選取任意數據結構實現添加、刪除、隨機返回三個功能,分析復雜度。
- 選擇排序(手寫代碼)
- 鏈表上的快速排序。
- 長度為N的序列Sequence=abc......Z,問有多少不同的二叉樹形態中序遍歷是這個。(Code)
- 問了一兩個算法題,記不清了,只記得其中一個是:找數組中2個出現兩次的數字,還有3個兩次的數字
- 問了一個1的平方加到100的平方結果
- 非常經典的0-1背包問題