華為面試題庫刷題第四次整理。
給你這棵「無向樹」,請你測算並返回它的「直徑」:這棵樹上最長簡單路徑的 邊數。0 <= edges.length < 10^4我們用乙個由所有「邊」組成的陣列 edges 來表示一棵無向樹,其中 edges[i] = [u, v] 表示節點 u 和 v 之間的雙向邊。
樹上的節點都已經用 中的數做了標記,每個節點上的標記都是獨一無二的。
edges[i][0] != edges[i][1]
0 <= edges[i][j] <= edges.length
edges 會形成一棵無向樹
解法:很明顯的dfs題目,但是最關鍵的是如何dfs。
我寫了乙個很傻的遍歷dfs,對所有只有一邊相連的點進行一次dfs,其實很明顯就可以發現有很多冗餘的搜尋。
**:
class solution
pairp1, p2;
p1 = ;
dfs(0, 0, p1);
visited.assign(l+2, false);
p2 = ;
dfs(p1.first, 0, p2);
return p2.second;
}void dfs(int u, int depth, pair& p)
for(int v: graph[u])
if(!visited[v])
dfs(v, depth + 1, p);
}};
給出乙個二進位制陣列 data,你需要通過交換位置,將陣列中 任何位置 上的 1 組合到一起,並返回所有可能中所需 最少的交換次數。1 <= data.length <= 10^5
0 <= data[i] <= 1
解法:滑動視窗很適合這題,算出1的個數為k,那麼視窗的大小就是p,滑動過程中更新視窗內的1的個數,記錄下最大的個數q,p-q就是答案。
**:
class solution ;
vectorres;
for(int i=0; i+k<=nums.size(); i++)
return res;
}};
這是這題的正解,用雙端佇列可以同時維護隊頭和隊尾,佇列裡面儲存索引,隊頭永遠是最大的,超出視窗大小就彈出隊頭,每次有新元素就從隊尾刪掉比新元素小的數。
**:
class solution ;
dequeq;
vectorres;
for(int i=0; inums[q.back()])
q.pop_back();
q.push_back(i);
}res.push_back(nums[q.front()]);
for(int i=k; inums[q.back()])//刪除隊尾小的索引
q.pop_back();
q.push_back(i);
res.push_back(nums[q.front()]);
}return res;
}};
這道題動態規劃的思路很巧,這裡我貼一下官方的解釋,講的很清楚,我就不多贅述了。
**:
class solution ;
vectorres,left;
vectorright(nums.size(),0);
int t = 0;
for(int i=0; i=0; i--)
t = max(t,nums[i]);
right[i] = t;
}for(int i=0; i+k<=nums.size(); i++)
res.push_back(max(left[i+k-1],right[i]));
return res;
}};
整數可以被看作是其因子的乘積。例如:8 = 2 x 2 x 2;
= 2 x 4.
請實現乙個函式,該函式接收乙個整數 n 並返回該整數所有的因子組合。
注意:你可以假定 n 為永遠為正數。
因子必須大於 1 並且小於 n。
示例:解法:很明顯的dfs,不過難點是儲存,根據示例給出的儲存順序,可以找到dfs的思路,每次拆解最後一位就行了,然後保證序列不下降。輸入: 32
輸出:[
[2, 16],
[2, 2, 8],
[2, 2, 2, 4],
[2, 2, 2, 2, 2],
[2, 4, 4],
[4, 8]
]
**:
class solution }}
vector> getfactors(int n) ;
dfs(temp);}}
return res;
}};
你的面前有一堵方形的、由多行磚塊組成的磚牆。 這些磚塊高度相同但是寬度不同。你現在要畫一條自頂向下的、穿過最少磚塊的垂線。磚牆由行的列表表示。 每一行都是乙個代表從左至右每塊磚的寬度的整數列表。
如果你畫的線只是從磚塊的邊緣經過,就不算穿過這塊磚。你需要找出怎樣畫才能使這條線穿過的磚塊數量最少,並且返回穿過的磚塊數量。
你不能沿著牆的兩個垂直邊緣之一畫線,這樣顯然是沒有穿過一塊磚的。
示例:解法:輸入:[1,2,2,1],
[3,1,2],
[1,3,2],
[2,4],
[3,1,2],
[1,3,1,1]]
輸出: 2
思路不太難,每一行的磚塊加上前面所有的寬度,然後因為這些寬度都是線性遞增的,所以加完之後,用hashmap記錄一下相同寬度的個數,最大的就是答案的位置。
**:
class solution
return l-res;
}};
還是先求和,然後用一維陣列存下所有的寬度,然後sort,比上一種方法快一點點。
**:
class solution
};
難度較大的微軟面試題
一面 英文自我介紹,第一題是個模擬,給一種字串加密方法,加密過程是把乙個串不斷左右左右移動 abcde dbace,你需要寫乙個還原函式,簡單模擬,注意長度 奇數偶數分開討論。o n 解決。但是可以常數小一點。第二題。給乙個森林 陣列形式 每個樹有個高度,現在我要選乙個高度,高於這個高度的樹木會被砍...
需要溫習的面試題
76 statement和preparedstatement有什麼區別?哪個效能更好?答 與statement相比,preparedstatement介面代表預編譯的語句,它主要的優勢在於可以減少sql的編譯錯誤並增加sql的安全性 減少sql注射攻擊的可能性 preparedstatement中的...
面試題13 機械人的運動範圍(中等題)
題目描述 地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但...