CodingTour
ARTS #24

Algorithm

本周选择的算法题是:4Sum

规则如下:

Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

The solution set must not contain duplicate quadruplets.

Example:

Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

Solution

我实现的方案:

Runtime:76 ms,快过 97.55%。

Memory:12.8 MB,低于 100%。

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        length = len(nums)
        if length < 4: return []
        nums.sort()

        return self.kSum(nums, target, 4, 0)

    def kSum(self, nums: List[int], target, k, low) -> List[List[int]]:
        results = []
        if k == 2:
            high = len(nums) - 1
            while low < high:
                sum = nums[low] + nums[high]
                if sum == target:
                    results.append([nums[low], nums[high]])

                    low += 1
                    while low < high and nums[low] == nums[low - 1]:
                        low += 1

                    high -= 1
                    while low < high and nums[high] == nums[high + 1]:
                        high -= 1
                elif sum < target:
                    low += 1
                else:
                    high -= 1
        else:
            for i in range(low, len(nums)):
                value = nums[i]
                if i > low and nums[i - 1] == value: continue # 避免重复
                if value + nums[-1] * (k - 1) < target: continue # 避免过小
                if value * k > target: break # 避免过大
                results += [[value] + suffix for suffix in self.kSum(nums, target - value, k - 1, i + 1)]

        return results

我写的思路超时了。。。这个思路来自于这里:7ms java code with over 100%,思路很棒很好理解。

Review

iOS WKWebView Communication Using Javascript and Swift

一篇在 WKWebView 里实现 JS 和 Swift 交互的文章,文字直白,例子也清晰,唯一的缺点就是文章不够深入,也没有对 iOS 上所有的 JS 交互方式总结吧。

请求拦截

这种方式通过修改 src 来触发 delegate 回调达到 js 调用原生的目的。

JavaScriptCore

这种方式通过 documentView.webView.mainFrame.javaScriptContext 来获取 JSContext,然后为 js 注入一些功能模块来达到 js 调用原生的目的。

WKScriptMessageHandler

js、原生双端维护各自的 bridge,js 通过 window.webkit.messageHandlers 来调用原生。

Tip

团队有小伙伴误删本地分支,可以通过 reflog 找回:

# 先通过 reflog 找到需要恢复分支的最新 sha
git reflog

# 再通过这个 sha 创建分支,如果提示有文件要被覆盖,可以加上 -f 选项
git checkout -b <branch> <sha>

Share

Swift

How to use Result in Swift

Result 是 Swift 5 引入的官方类型。在以前我们需要自己实现一个 enum 来达到这样的目的:

fetchUnreadCount1(from: "https://www.hackingwithswift.com") { result in
    switch result {
    case .success(let count):
        print("\(count) unread messages.")
    case .failure(let error):
        print(error.localizedDescription)
    }
}

Python

Python 有大量容易上手的工具,这里简单总结三个:

NamedTuple

可以用于构建一个没有行为的实体类型:

# 模块配置
ModuleConfig = collections.namedtuple("ModuleConfig", [
    "name", "target"
])

config = ModuleTestConfig("test", "target")
config.name # test
config.target # target

Counter

用于计数的字典,官方例子:

c = Counter()
c['bacon'] # 0
c['e'] += 1
c['e'] # 1
c['e'] += 1
c['e'] # 2

DefaultDict

还有用 list 或者 set 构建的集合字典:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)

list(d.items())
# [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]