给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。
挺难的一道题(毕竟是困难),看了题解懂了,自己写恐怕难写,把 k 分成 m 和 n,分别挑出两个数组的最大值,然后合并成一个"最大值",遍历所有情况(m,n 分别从 0 到各自数组的最大长度),返回最大的"最大值"。
下面首先是 Python 版本,由于存在 max 函数,会使得代码短不少,而且可读性也很高。
classSolution:defmaxNumber(self,nums1,nums2,k):defpick_max(nums,k): stack = [] drop =len(nums)- kfor num in nums:while drop and stack and stack[-1]< num: stack.pop() drop -=1 stack.append(num)return stack[:k]defmerge(A,B): ans = []while A or B: bigger = A if A > B else B ans.append(bigger.pop(0))return ansreturnmax(merge(pick_max(nums1, i), pick_max(nums2, k - i))for i inrange(k +1)if i <=len(nums1) and k - i <=len(nums2) )
这段代码让我大开眼界,对于一个 Go 新手来说 merge 函数中间的赋值让我只呼牛皮,lexicographicalLess 函数的复用也是让我眼前一亮,果然是内行。
funcmaxSubsequence(a []int, k int) (s []int) {for i, v :=range a {forlen(s) >0&&len(s)+len(a)-1-i >= k && v > s[len(s)-1] { s = s[:len(s)-1] }iflen(s) < k { s =append(s, v) } }return}funclexicographicalLess(a, b []int) bool {for i :=0; i <len(a) && i <len(b); i++ {if a[i] != b[i] {return a[i] < b[i] } }returnlen(a) <len(b)}funcmerge(a, b []int) []int { merged :=make([]int, len(a)+len(b))for i :=range merged {iflexicographicalLess(a, b) { merged[i], b = b[0], b[1:] } else { merged[i], a = a[0], a[1:] } }return merged}funcmaxNumber(nums1, nums2 []int, k int) (res []int) { start :=0if k >len(nums2) { start = k -len(nums2) }for i := start; i <= k && i <=len(nums1); i++ { s1 :=maxSubsequence(nums1, i) s2 :=maxSubsequence(nums2, k-i) merged :=merge(s1, s2)iflexicographicalLess(res, merged) { res = merged } }return}
wsl1 和 win32 相对于 NT 内核来说是类似的,都是环境子系统(environment subsystem),wsl1 提供了运行 Linux 的环境,因此它需要实现 Linux 的所有 ABI 接口。给我的感觉就是在用户与 NT 内核之间加了一层,负责识别 Linux 命令,然后转化为 NT 内核可识别的原语从而执行,跟 Shell 有点像?
wsl2 则是一个虚拟机,运行着一个完整的 Linux 系统(内核,文件系统和网络堆栈),这样就不需要重新实现 Linux 所有的 ABI 了,减少了工程实现压力。
目前使用 wsl2 比 wsl1 舒服,但是文件系统还是有问题,访问 Windows 的文件夹(C、D 盘)的权限是 777,还有个是命令的问题,当使用 Windows 的程序时,需要加 .exe 才能跑起来,比如运行 sublime,在 Windows 完全可以在运行或者 cmd 中输入 subl,但是在 wsl2 中不行,必须使用 subl.exe,感觉有点蠢。
作者提到在 wsl1 中可以使用 ps/top/kill 查看和杀死 Windows 进程、可以用命令管理 Windows 服务、用 ifconfig 管理网卡,这些为啥我之前没注意到?