原创 UVa上未解決的題目

來自《挑戰編程》和《算法競賽入門經典(第2版)》 Programming Challenges 習題1.6.3 10137 TheTrip 因爲這道題的測試用例有錯誤,詳見這裏3樓的評論 浮點數的題目我一向沒有好感 習題4.6

原创 程序員面試金典 8.14

Boolean Evaluation:給定一個只含有1、0、&、|和^的布爾表達式,求所有加括號的方式,使得該表達式的值爲result,不考慮多餘括號的情況。 與其說加括號,不如說決定每個位運算符的被求值的順序,首先選定一個運算符

原创 程序員面試金典 16.14

Best Line:給定平面上n個點,找出一條直線,使其通過的點數最多。 書上的解法:求出兩兩相連後的斜率,平行線歸爲一類,在平行線中找重合的直線。由於存在浮點數誤差,斜率差值小於epsilon的也算做平行線。 由於力扣上的輸入都

原创 程序員面試金典 10.1

Sorted Merge:給定兩個已經排好序的數組A和B,將B合併到A中。 如果從數組頭部開始合併,則需要開闢額外的空間,或者批量移動A中的元素,所以應該從數組尾部合併,也就是從大到小合併。 class Solution { pu

原创 程序員面試金典 16.19

Pond Sizes:統計一片矩形區域中連通的池塘數目。 只需要遍歷每一個點,深搜統計連通的池塘大小,最後排序返回即可。 class Solution { public: vector<int> pondSizes(vec

原创 程序員面試金典 16.13

Bisect Squares:給定兩個正方形和一個二維平面,求一條平分兩個正方形的最長線段,如果有多條線段,返回斜率最大的一條的兩端點。 這條線段肯定過這兩個正方形的中心,根據這兩個中心確定一條直線,然後求4個交點,選擇最遠的兩個

原创 程序員面試金典 16.18

Pattern Matching:給定模式串和一個字符串,模式串中只包含a和b,判斷字符串是否和模式串匹配。 首先要明確模式串中只有a和b,所以一旦確定了a的匹配串,就可以根據a和b的數量,確定b的匹配串,然後構造出字符串進行完整

原创 程序員面試金典 8.5

Recursive Multiply:實現一個遞歸算法,只使用加法、減法和移位實現兩個數字相乘。 可以將其中的一個數減半,求出乘積。如果被減半的數是偶數,則將乘積翻倍即可,否則再計算另一部分的乘積。 class Solution

原创 程序員面試金典 16.11

Diving Board:求使用k塊長度爲shorter和longer的木板能組成的所有木板長度。 因爲有k塊木板,要做k次決策,每一次有兩種選擇方法,根據這個思路可以寫一個遞歸程序,時間複雜度爲O(2 ^ k),力扣上測試用例[

原创 程序員面試金典 10.2

Group Anagrams:對字符串數組進行重組,使得互爲排列的兩個單詞相鄰。 根據1.2題的解法,判斷兩個單詞是否互爲排列有兩種方法,一種是統計字母頻數,另一種是排序然後比較。統計字母頻數進行比較的時間複雜度爲O(n ^ 2

原创 程序員面試金典 16.10

Living People:給定一些人的出生年份和死亡年份,計算哪一年活着的人數最多,相同情況下輸出年份最小的,假設年份都在[1900, 2000]。 簡單的解法就是暴力搜索,反正就100年,時間複雜度爲O(RP),其中R表示年份

原创 程序員面試金典 8.8

Permutations with Duplicates:生成一個字符串的所有排列,字符串中包含重複字符。 可以借鑑上一題的解法,生成所有的排列然後去重,但是這種方法的效率太低了,我們更希望只枚舉重複的排列一次。 在上一道題中,因

原创 程序員面試金典 16.17

Contiguous Sequence:求數組中子序列的最大和。 如果將相鄰的正負數合併求和,那麼就得到了一個正負數相間的序列。 接下來考察每一個元素: 如果累加和加上當前元素後依然是正數,那麼和後面的正數求和後一定會更大,最大

原创 程序員面試金典 16.16

Sub Sort:在整數序列中求出一個最短區間[m, n],滿足將該區間內的數據升序排序後,整個序列都升序。 根據題意,如果對[m, n]之間的數據進行排序就可以使整個序列有序,那麼區間[0, m)和下標大於n的數據都應該是有序的

原创 程序員面試金典 10.3

Search in Rotated Array:在一個經過多次旋轉的有序數組中查找一個元素的位置,如果有多個,返回索引最小的位置。 書上也沒說旋轉是什麼意思,翻了半天題解看懂了什麼是旋轉,也就是把數組中最開始的若干個元素移動到末尾