面試題51. 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
利用歸併排序,將陣列分成兩部分,前面一部分和後面一部分,進行歸併的時候,需要比較兩個陣列的數值大小,如果第二個陣列的值小的話,代表前乙個陣列剩下的都比當前值大,則可以計算出逆序對的大小
面試題60. n個骰子的點數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)
把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
面試題 17.15. 最長單詞public double twosum(int n)
for(int i=1;i<=n;i++)
if(i==n)}}
return ans;
}
給定一組單詞words,編寫乙個程式,找出其中的最長單詞,且該單詞由這組單詞中的其他單詞組合而成。若有多個長度相同的結果,返回其中字典序最小的一項,若沒有符合要求的單詞則返回空字串。
思路:按照長度降序排序,如果長度相等就按照字典序排序。這樣的話如果每個單詞都是組合單詞,那麼最前面的單詞就是題目要求的返回單詞。
遍歷排序後的單詞陣列,如果是復合單詞就返回
復合單詞檢測思路: 目標單詞的前i個字母是單詞列表裡面的單詞 && 剩下的字母是組合單詞
面試題 05.07. 配對交換public boolean iscomparedword(setset,string word)else
}});
setset=new hashset<>(arrays.aslist(words));
for(string word:words)
set.add(word);
}return "";
}
配對交換。編寫程式,交換某個整數的奇數字和偶數字,盡量使用較少的指令(也就是說,位0與位1交換,位2與位3交換,以此類推)。
分別得到奇數字和偶數字,然後進行或運算
public int exchangebits(int num)
面試題 17.04. 消失的數字
陣列nums
包含從0
到n
的所有整數,但其中缺了乙個。請編寫**找出那個缺失的整數。你有辦法在o(n)時間內完成嗎?
利用求和公式
面試題 10.05. 稀疏陣列搜尋public int missingnumber(int nums)
return sum;
}
稀疏陣列搜尋。有個排好序的字串陣列,其中散布著一些空字串,編寫一種方法,找出給定字串的位置。
很容易想到二分查詢,對於有空字串需要進行單獨處理
面試題 16.05. 階乘尾數public int findstring(string words, string s)
return -1;
}
設計乙個演算法,算出 n 階乘有多少個尾隨零。
0 是由 *10 得到的,而 10 是由 2 * 5 得到的,因此求 n!過程中存在多少個 2 * 5,因為 2 的個數必定比 5 的個數多,因此只求 5 的個數,如果直接乙個乙個遍歷,即
那麼 n 過大時,從 1 遍歷到 n, 那麼會超時,因此我們修改下規律for(int i = 5; i <= n; i++)
}
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 + ...
面試題 05.03. 翻轉數字public int trailingzeroes(int n)
return count;
}
給定乙個32位整數num
,你可以將乙個數字從0變為1。請編寫乙個程式,找出你能夠獲得的最長的一串1的長度。
遍歷每一位,統計「0分隔」開的前串長度和後串長度;每次遇到0時,則將前串和後串相加再+1得到當前翻轉的最大串( maxpre + 1 + maxafter);與 max 比較選出最大值儲存即可。
面試題 05.06. 整數轉換public int reversebits(int num) else
num>>=1;
}return math.max(max,maxpre+1+maxafter);
}
整數轉換。編寫乙個函式,確定需要改變幾個位才能將整數a轉成整數b。
漢明距離
面試題 04.12. 求和路徑public int convertinteger(int a, int b)
return cnt;
}
給定一棵二叉樹,其中每個節點都含有乙個整數數值(該值或正或負)。設計乙個演算法,列印節點數值總和等於某個給定值的所有路徑的數量。注意,路徑不一定非得從二叉樹的根節點或葉節點開始或結束,但是其方向必須向下(只能從父節點指向子節點方向)。
以根結點的求和+左結點的求和+右節點的求和
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 ...