leetcode 面試題專題

2021-10-06 06:35:43 字數 3748 閱讀 9852

面試題51. 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。

利用歸併排序,將陣列分成兩部分,前面一部分和後面一部分,進行歸併的時候,需要比較兩個陣列的數值大小,如果第二個陣列的值小的話,代表前乙個陣列剩下的都比當前值大,則可以計算出逆序對的大小

private int cnt=0;

public void merge(int nums,int ps,int pe,int ls,int le)else

}while (ps<=pe)tmp[index++]=nums[ps++];

while (ls<=le)tmp[index++]=nums[ls++];

for(int i=0;i=end)return;

int mid=(start+end)/2;

mergesort(nums,start,mid);

mergesort(nums,mid+1,end);

merge(nums,start,mid,mid+1,end);

}public int reversepairs(int nums)

面試題60. n個骰子的點數

把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。

你需要用乙個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。

分析:f(n)(j)表示n個骰子和為j,那麼f(n)(j)=f(n-1)(j-1)+f(n-1)(j-2)+f(n-1)(j-3)+f(n-1)(j-4)+f(n-1)(j-5)+f(n-1)(j-6)

分別對應最後乙個骰子的點數。所有可能出現的情況有pow(6,n)種,最後的結果值有5n種結果。當有n個骰子時,和最小也是n

public double twosum(int n) 

for(int i=1;i<=n;i++)

if(i==n)}}

return ans;

}

面試題 17.15. 最長單詞

給定一組單詞words,編寫乙個程式,找出其中的最長單詞,且該單詞由這組單詞中的其他單詞組合而成。若有多個長度相同的結果,返回其中字典序最小的一項,若沒有符合要求的單詞則返回空字串。

思路:按照長度降序排序,如果長度相等就按照字典序排序。這樣的話如果每個單詞都是組合單詞,那麼最前面的單詞就是題目要求的返回單詞。

遍歷排序後的單詞陣列,如果是復合單詞就返回

復合單詞檢測思路: 目標單詞的前i個字母是單詞列表裡面的單詞 && 剩下的字母是組合單詞

public boolean iscomparedword(setset,string word)else

}});

setset=new hashset<>(arrays.aslist(words));

for(string word:words)

set.add(word);

}return "";

}

面試題 05.07. 配對交換

配對交換。編寫程式,交換某個整數的奇數字和偶數字,盡量使用較少的指令(也就是說,位0與位1交換,位2與位3交換,以此類推)。

分別得到奇數字和偶數字,然後進行或運算

public int exchangebits(int num)
面試題 17.04. 消失的數字

陣列nums包含從0n的所有整數,但其中缺了乙個。請編寫**找出那個缺失的整數。你有辦法在o(n)時間內完成嗎?

利用求和公式

public int missingnumber(int nums) 

return sum;

}

面試題 10.05. 稀疏陣列搜尋

稀疏陣列搜尋。有個排好序的字串陣列,其中散布著一些空字串,編寫一種方法,找出給定字串的位置。

很容易想到二分查詢,對於有空字串需要進行單獨處理

public int findstring(string words, string s) 

return -1;

}

面試題 16.05. 階乘尾數

設計乙個演算法,算出 n 階乘有多少個尾隨零。

0 是由 *10 得到的,而 10 是由 2 * 5 得到的,因此求 n!過程中存在多少個 2 * 5,因為 2 的個數必定比 5 的個數多,因此只求 5 的個數,如果直接乙個乙個遍歷,即 

for(int i = 5; i <= n; i++)

}

那麼 n 過大時,從 1 遍歷到 n, 那麼會超時,因此我們修改下規律

n! = 1 * 2 * 3 * 4 * (1 * 5) * ... * (2 * 5) * ... * (3 * 5) ...

每隔 5 個數就會出現 乙個 5,因此只需要通過 n / 5 來計算存在存在多少個 5 個數,那麼就對應的存在多少個 5。但是,每隔 25 個數會出現 乙個 25, 而 25 存在 兩個 5,我們上面只計算了 25 的乙個 5,因此我們需要 n / 25 來計算存在多少個 25,加上它遺漏的 5,同時,每隔 125 個數會出現乙個 125,而 125 存在 三個 5,我們上面只計算了 125 的兩個 5,因此我們需要 n / 125 來計算存在多少個 125,加上它遺漏的 5,因此 count = n / 5 + n / 25 + n / 125 + ...最終分母可能過大溢位,上面的式子可以進行轉換

count = n / 5 + n / 5 / 5 + n / 5 / 5 / 5 + ...

public int trailingzeroes(int n) 

return count;

}

面試題 05.03. 翻轉數字

給定乙個32位整數num,你可以將乙個數字從0變為1。請編寫乙個程式,找出你能夠獲得的最長的一串1的長度。

遍歷每一位,統計「0分隔」開的前串長度和後串長度;每次遇到0時,則將前串和後串相加再+1得到當前翻轉的最大串( maxpre + 1 + maxafter);與 max 比較選出最大值儲存即可。

public int reversebits(int num) else

num>>=1;

}return math.max(max,maxpre+1+maxafter);

}

面試題 05.06. 整數轉換

整數轉換。編寫乙個函式,確定需要改變幾個位才能將整數a轉成整數b。

漢明距離

public int convertinteger(int a, int b) 

return cnt;

}

面試題 04.12. 求和路徑

給定一棵二叉樹,其中每個節點都含有乙個整數數值(該值或正或負)。設計乙個演算法,列印節點數值總和等於某個給定值的所有路徑的數量。注意,路徑不一定非得從二叉樹的根節點或葉節點開始或結束,但是其方向必須向下(只能從父節點指向子節點方向)。

以根結點的求和+左結點的求和+右節點的求和

public int dfs(treenode root,int sum)

public int pathsum(treenode root, int sum)

位元組面試題 leetcode

給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,2 解釋 第乙個 ...

leetcode面試題 08 11 硬幣

硬幣。給定數量不限的硬幣,幣值為25分 10分 5分和1分,編寫 計算n分有幾種表示法。結果可能會很大,你需要將結果模上1000000007 示例1 輸入 n 5 輸出 2 解釋 有兩種方式可以湊成總金額 5 55 1 1 1 1 1 示例2 輸入 n 10 輸出 4 解釋 有四種方式可以湊成總金額...

LeetCode 面試題 16 03 交點

給定兩條線段 表示為起點start 和終點end 如果它們有交點,請計算其交點,沒有交點則返回空值。要求浮點型誤差不超過10 6。若有多個交點 線段重疊 則返回 x 值最小的點,x 座標相同則返回 y 值最小的點。示例 1 輸入 line1 line2 輸出 示例 2 輸入 line1 line2 ...