今年 1 月的 微軟 26 NG OA ,依舊是 HackerRank 平台的兩道編程題。整體風格:medium-hard、考點紮實、細節決定生死。我這次也是順順利利一次 AC,趁熱把題目 & 思路一起分享,希望你們也能一次過,這也是原題來的,兩題不到半小時,兩題AC。
微軟 2026 NG OA 真題(1月最新)
Problem 1
給定一個字符串 s,枚舉它的所有連續子串,在按字典序(alphabetical / lexicographical order)排序後,找出排在最後(最大的)那個子串並返回。注意比較的是字典序而不是長度,長字符串不一定更大;本質上等價於在所有子串中找“字典序最大”的那個。由於字典序比較是從首字符開始的,因此答案一定以字符串中字典序最大的字符開頭,並在這些起點對應的後綴/子串中選出最大的那個。
思路:所有子串裡字典序最大的,一定等價於“所有後綴裡字典序最大的”,因為任意子串都是某個後綴的前綴。用雙指針比較兩個後綴,從左到右淘汰較小的起點,最終留下的起點就是最大後綴的起點。
代码
def maxSubstring(s):
n = len(s)
i = 0
j = 1
k = 0
while j + k < n:
if s[i + k] == s[j + k]:
k += 1
elif s[i + k] < s[j + k]:
i = j
j = i + 1
k = 0
else:
j = j + k + 1
k = 0
if j == i:
j += 1
return s[i:]
Problem 2
給定一個長度為 n 的排列數組 p,對每個整數 k(1 ≤ k ≤ n) 判斷它是否是 balanced:如果存在一段連續子數組 p[l..r],其元素恰好構成 {1,2,…,k} 的一個排列(即長度為 k,最小值為 1,最大值為 k,且無重複),則 k 是 balanced。需要對每個 k 給出結果,返回一個長度為 n 的二進製字符串,第 k 位為 '1' 表示 k balanced,否則為 '0'。考察 1..k 這些數在排列中的位置是否能形成一個連續區間。
思路:我們先把每個數字的位置記下來,用一個數組 pos[val] = index,這樣能 O(1) 找到值 k 在哪。從 k = 1 開始往上掃,把目前 1..k 這些數出現過的最小下標 l 和最大下標 r 維護起來。如果當前這段區間長度 r - l + 1 正好等於 k,說明 1..k 這 k 個數正好連續出現,是一個排列,就記 1,否則記 0
代码
def countBalancedNumbers(p):
n = len(p)
pos = [0] * (n + 1)
for i, val in enumerate(p):
pos[val] = i
l = pos[1]
r = pos[1]
ans = []
for k in range(1, n + 1):
if k > 1:
idx = pos[k]
if idx < l:
l = idx
if idx > r:
r = idx
if r - l + 1 == k:
ans.append('1')
else:
ans.append('0')
return ''.join(ans)
微軟 OA 的兩道題難度多大?
微軟 OA 風格一直比較穩定:
- 套路並不刁鑽,但非常注重“程式碼質量 + 複雜度 + 邊界處理”。
- 當場寫程式碼通常沒太多時間 debug,所以 O(n) 方法要寫得非常熟練。
- 第二題屬於微軟常見的 permutation reasoning 類問題,很考邏輯嚴謹度。
如果你平時訓練不夠,這類題會覺得“腦子想到了但寫不順”;但只要做對方向,程式碼都不復雜。
ProgramHelp 微軟 2026 NG OA 專項助攻
今年微軟 2026 NG 的 OA 明顯更“卷”,Hackerrank 兩題雖然不算超綱,但邏輯細、坑點多、時間緊,這也是很多同學掉點的原因。我們這邊已經積累了多批次學員的真場景回放,包括 12 月最新版本的題型變化、常見卡點、最容易誤判的邊界情況。
如果你想更穩,我們可以提供:
- 實時語音助攻:做題過程中給你實時答案提示、代碼、思路、dry run等。
- 0 痕跡OA輔助助攻:全程安全,不觸發平臺檢測,用的是我們穩定驗證過的技術方案。