C 常見面試題整理

2021-10-23 18:38:24 字數 4018 閱讀 2835

最小堆pop最小的,最大堆pop最大的

設計乙個演算法,找出陣列中最小的k個數。以任意順序返回這k個數均可

//最大堆

class solution

while(!maxheap.empty())

return out;}};

在未排序的陣列中找到第k個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

//最小堆

class solution

return minheap.top();}};

給定乙個整型陣列, 你的任務是找到所有該陣列的遞增子串行,遞增子串行的長度至少是2。

示例:輸入: [4, 6, 7, 7]

輸出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

那如何保證沒有重複呢?我們需要給「不選擇」做乙個限定條件,只有當當前的元素不等於上乙個選擇的元素的時候,才考慮不選擇當前元素,直接遞迴後面的元素。因為如果有兩個相同的元素,我們會考慮這樣四種情況:【從小(兩個連續數)入手考慮重複性問題

前者被選擇,後者被選擇

前者被選擇,後者不被選擇

前者不被選擇,後者被選擇

前者不被選擇,後者不被選擇

其中第二種情況和第三種情況其實是等價的,我們這樣限制之後,捨棄了第二種,保留了第三種,於是達到了去重的目的。

這個去重我喜歡

class solution 

return;

}if (nums[cur] >= last)

if (nums[cur] != last)

}vector> findsubsequences(vector& nums)

};

兩個(具有不同單詞的)文件的交集(intersection)中元素的個數除以並集(union)中元素的個數,就是這兩個文件的相似度。例如, 和 的相似度是 0.4,其中,交集的元素有 2 個,並集的元素有 5 個。給定一系列的長篇文件,每個文件元素各不相同,並與乙個 id 相關聯。它們的相似度非常「稀疏」,也就是說任選 2 個文件,相似度都很接近 0。請設計乙個演算法返回每對文件的 id 及其相似度。只需輸出相似度大於 0 的組合。請忽略空文件。為簡單起見,可以假定每個文件由乙個含有不同整數的陣列表示。

輸入為乙個二維陣列 docs,docs[i] 表示 id 為 i 的文件。返回乙個陣列,其中每個元素是乙個字串,代表每對相似度大於 0 的文件,其格式為 ,: ,其中 id1 為兩個文件中較小的 id,similarity 為相似度,精確到小數點後 4 位。以任意順序返回陣列均可。

示例:輸入: 

[[14, 15, 100, 9, 3],

[32, 1, 9, 3, 5],

[15, 29, 2, 6, 8, 7],

[7, 10]

]輸出:

["0,1: 0.2500",

"0,2: 0.1000",

"2,3: 0.1429"

]這個題來學習雜湊挺好的

class solution 

}return result;}};

在乙個陣列 nums 中除乙個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。

示例 1:

輸入:nums = [3,4,3,3]

輸出:4

示例 2:

輸入:nums = [9,1,7,9,7,9,7]

輸出:1

兩位 two one表示各bit位出現次數,出現三次剛好恢復至0 

關鍵設計狀態機

有些數的素因子只有 3,5,7,請設計乙個演算法找出第 k 個數。注意,不是必須有這些素因子,而是必須不包含其他的素因子。例如,前幾個數按順序應該是 1,3,5,7,9,15,21。

示例 1:

輸入: k = 5

輸出: 9

class solution 

//二分搜尋

ll binary_search(ll low,ll high,int a,int b,int c,ll n)

//求最小公倍數:兩數乘積除以最大公約數

ll mcm(ll a,ll b)

return multi/a;}};

輸入:a = [1,1,2,2,3,3,4,4,5,5], target = 8

輸出:20

解釋:按值列舉(a[i],a[j],a[k]):

(1, 2, 5) 出現 8 次;

(1, 3, 4) 出現 8 次;

(2, 2, 4) 出現 2 次;

(2, 3, 3) 出現 2 次。

三指標,寫的比較稀碎

class solution 

//最終答案就是考慮前n個數時,選擇其中3個數,組成target大小的方案數

return dp[n][3][target];}};

有乙個二維矩陣 grid ,每個位置要麼是陸地(記號為 0 )要麼是水域(記號為 1 )。

我們從一塊陸地出發,每次可以往上下左右 4 個方向相鄰區域走,能走到的所有陸地區域,我們將其稱為一座「島嶼」。

如果一座島嶼 完全 由水域包圍,即陸地邊緣上下左右所有相鄰區域都是水域,那麼我們將其稱為 「封閉島嶼」。

請返回封閉島嶼的數目。

示例 1:

輸入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]

輸出:2

解釋:灰色區域的島嶼是封閉島嶼,因為這座島嶼完全被水域包圍(即被 1 區域包圍)。

bfs,廣度優先搜尋,把遍歷過的點置1.

class solution 

if(curpos.first+1-1 && grid[curpos.first][curpos.second-1]==0)

if(curpos.second+1給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。

示例 :

給定二叉樹

1/ \

2   3

/ \     

4   5    

返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。

/*** definition for a binary tree node.

* struct treenode

* };

*/class solution

if(mid>target/mid)

erfen(left,mid-1,target);

else

erfen(mid+1,right,target);

}int mysqrt(int x)

private:

int res;

};

常見面試題整理

題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 注意點 1.返回值是否為該型別的引用。如果為該型別引用則可連續賦值。如果返回void,則無法通過編譯 2.傳入引數是否宣告為常量引用。如果傳入引數不是常量引用,則會有一次非必要的拷貝構造函式呼叫 ...

常見面試題整理1

面試題整理1 相同點 都是繼承collection介面 不同點 1.list 元素存放有順序,元素可重複 set 元素存放無順序,元素不可重複 2.list 支援for迴圈,也可以用迭代器 set 只能用迭代器,因為它是無序的,無法通過下標獲取元素 3.list和陣列相似,查詢元素效率高,插入刪除元...

C C 常見面試題整理

事情皆有因果。卻有未必好因造好果,看你是短看還是長看。從概率和從極長遠來看,當然是好人好報,但是具體短期的隨機性就無法 了。在該函式前新增extern c 宣告。由於編譯後的名字不同,c 程式不能直接呼叫c 函式。a c 中的類預設的成員是私有的,struct預設的是共有的。b c 中的類可以定義成...