Python技术迷

36岁后端研发,娃两岁,老婆全职带娃,手里一共320万,天津和老家河北小城怎么选?

刚看到个贴子,网友在纠结要不要留在天津买房工作,还是回河北老家定居。

Image

手里320万,娃两岁,老婆全职带娃,看起来日子不差,但其实选哪边都挺难。天津机会多,可房价高、压力大;老家生活轻松点,但收入和发展都不稳。网友们的回复也挺两极的,有人说趁年轻搏一搏,也有人劝回家图安稳。

有孩子、有家庭,决定的不只是工作,还有家庭平衡和心理状态。天津是打拼场,老家是安顿地,不能同时要。想要成长,就得承担不确定;想要稳定,就得放下一部分野心。没有完美答案,只有适合当下的选择。

总的来说,能照顾家庭、保持收入、心里踏实,那才是真正的赢。【备注:文末可领最新资料】

面试题:两个字母卡牌游戏

昨天晚上十一点多,在公司楼下吹风,手机快没电…小李突然甩过来一道题,说是他们在做个“两个字母卡牌”的小游戏,逻辑总是超时。我一边找充电宝一边嘴上嘟囔:行行行,说吧…

有 N 张卡牌,第 i 张卡牌有两个字母 (A[i], B[i]),正反面随你选。把所有牌排成一行,每张只能露一个面。问:能不能让整行字母都一样?如果能,一共最少翻几张牌(翻面算一次)。比如 (a,c),(c,c),(b,c),把第1张翻到 c,第3张翻到 c,全是 c,最少 2 次。

我当时就说:别想太多,这题跟“多米诺最少旋转”是一个套路。

就是猜“目标字母”。要想全相等,那最终字母肯定来自第一张牌的两个候选——不然第一张都摆不出来,对吧。于是我们只用检查两次:

  • 假设目标字母是 A[0]
  • 假设目标字母是 B[0]每次线性扫一遍:对每张牌
  • 如果两面都不是目标,失败
  • 如果一面是目标,看看是否需要翻面,计数即可

两次取最小。时间 O(N),空间 O(1)。就这,别跟它纠缠 DP 啥的,纯暴力剪枝版。

有人会问:目标字母只看第一张,万一答案是别的字母?——不可能。因为第一张最终必须显示某个字母,整体相等就只能跟它一样。 还有就是全部已经相等时,翻零次,别写成空判断抛异常…我见过…

from typing import List, Tuple

def_try_target(cards: List[Tuple[str, str]], target: str) -> int:
    flips = 0
for a, b in cards:
if a == target and b == target:
# 不翻也行,翻也行,取最省的:不翻
continue
elif a == target:
# 正面就是目标,不翻
continue
elif b == target:
# 需要翻一次把 b 翻到前面(抽象动作)
            flips += 1
else:
return float('inf')  # 这条路走不通
return flips

defmin_flips_to_unify(cards: List[Tuple[str, str]]) -> int:
ifnot cards:
return0# 空集合就当已经相等
    a0, b0 = cards[0]
    ans = min(_try_target(cards, a0), _try_target(cards, b0))
return-1if ans == float('inf') else ans

# 演示
if __name__ == "__main__":
    cards = [('a','c'), ('c','c'), ('b','c')]
    print(min_flips_to_unify(cards))  # 2

复杂度

整套逻辑只扫两遍,**时间 O(N)、空间 O(1)**。要是产品经理又来一嘴“那能不能顺便给出哪几张要翻?”也好办:在 _try_target 里把需要翻的下标顺手存个列表;要“支持大小写混合统一成同一个字母”这种脑洞,就在比较前把 a,b,target 走一遍 lower() 或 upper() 归一化;要是还想“尽量选择字典序最小的目标字母”,那就把第一张两个候选按字典序先后试,平手取小的…行了行了,咖啡凉了我先去倒,等会儿有人要是问为啥老是选第一张,我再画个小证明…

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领