需要耐心的中等難度題 華為面試題庫刷題整理(四)

2021-10-04 05:16:48 字數 3209 閱讀 3802

華為面試題庫刷題第四次整理。

給你這棵「無向樹」,請你測算並返回它的「直徑」:這棵樹上最長簡單路徑的 邊數。

我們用乙個由所有「邊」組成的陣列 edges 來表示一棵無向樹,其中 edges[i] = [u, v] 表示節點 u 和 v 之間的雙向邊。

樹上的節點都已經用 中的數做了標記,每個節點上的標記都是獨一無二的。

0 <= edges.length < 10^4

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。

示例:

輸入: 32

輸出:[

[2, 16],

[2, 2, 8],

[2, 2, 2, 4],

[2, 2, 2, 2, 2],

[2, 4, 4],

[4, 8]

]

解法:很明顯的dfs,不過難點是儲存,根據示例給出的儲存順序,可以找到dfs的思路,每次拆解最後一位就行了,然後保證序列不下降。

**:

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。但...