Python技术迷

“王炸女生”,93年,168,博士毕业,律师,江西人,有个弟弟

刚看到个贴子,说有个93年的江西妹子,168高,博士学历,律师职业,家境也不错,就是没人敢追。原因嘛——江西彩礼高,还得帮衬弟弟。男生们一看资料就摇头。

Image

现在的婚姻市场,大家都在算“成本”和“风险”。女生条件再好,一旦被贴上“彩礼高”“要扶弟”的标签,就成了“王炸”变“炸弹”。但问题的根本不是她本人,而是大家对家庭责任的恐惧。

网友们说“谁敢娶”,其实反映的是普遍焦虑:怕付出不成比例。可从另一面看,这妹子也是靠自己拼出来的博士律师,难道就该被原生家庭拖累?换个角度想,彩礼和弟弟,不该成为否定她的理由。

婚姻不是做生意,别光看成本,也得看人品和价值观。遇到一个独立、自强的伴侣,比啥都靠谱。【备注:文末可领最新资料】

面试题:分数加减运算

有时候我们写那种小计算器或者刷算法题的时候,会遇到这种输入:“1/3-1/2+2/5”,看起来挺简单吧,但要是让程序去算,就得一个个拆分、求通分、约分,这些都得自己写逻辑。

我那天晚上写这玩意儿的时候已经快十二点了,脑子晕乎乎的,还在公司那台显示器前盯着看半天,后来我就干脆写了个小函数,一步步搞明白它到底咋处理。

先说下整体思路啊,就是这样:

  1. 先把整串分数表达式,比如 "1/3-1/2+2/5",都拆成独立的项;
  2. 把每一项的分子、分母拿出来;
  3. 按规则加减,比如 a/b + c/d = (a*d + b*c) / (b*d);
  4. 最后把结果约分成最简形式。

我当时写的 Python 代码大概长这样👇

from fractions import Fraction

deffraction_addition(expression: str) -> str:
    i = 0
    fractions = []
while i < len(expression):
        j = i + 1
# 把每个分数(包括符号)完整切出来
while j < len(expression) and expression[j] notin'+-':
            j += 1
        fractions.append(Fraction(expression[i:j]))
        i = j

    result = sum(fractions)
returnf"{result.numerator}/{result.denominator}"

print(fraction_addition("-1/2+1/2+1/3"))  # 输出 1/3

Fraction 这个模块真的太香了,直接帮我们做了通分、约分的事儿。以前我还傻乎乎地自己写 gcd(最大公约数)函数,现在直接一句搞定,真的省心。

不过呢,如果不让用 Fraction,那就得自己手搓一个。

大概流程是这样的:

import math

defadd_fractions(expression):
    i = 0
    num, den = 0, 1# 初始是 0/1
while i < len(expression):
        sign = 1
if expression[i] in'+-':
            sign = -1if expression[i] == '-'else1
            i += 1
        j = i
while j < len(expression) and expression[j] != '+'and expression[j] != '-':
            j += 1
        n, d = map(int, expression[i:j].split('/'))
        num = num * d + sign * n * den
        den *= d
        g = math.gcd(num, den)
        num //= g
        den //= g
        i = j
returnf"{num}/{den}"

print(add_fractions("1/3-1/2+2/5"))  # 输出 7/30

这玩意儿看起来有点绕,主要是得小心正负号和约分那一块。 每次加完都要除以最大公约数,不然很容易爆成巨大的分母。

有意思的是,我那天写完后测试的时候,输入 "5/3+1/3" 居然输出了 "2/1",我看懵了,还以为代码有 bug,后来才反应过来,哎呀,它其实就是 2 嘛。 这时候要是想让结果更“人话”一点,可以加个判断:

if den == 1:
return str(num)

这样输出就是 2,不是 2/1。

总结下: 其实这题不算难,但细节一多就容易出岔子。正负号、通分、约分、字符串拆分,每个都能踩坑。 我当时一边调试一边笑,心想,这要是让小孩手算估计比写代码还快。 不过写完运行那一刻,控制台里蹦出个 "7/30",那种小满足感还真挺爽。

要我说啊,算法题就像生活一样,麻烦的不是思路,而是那些看起来无关紧要的小细节。

-END-

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

🔥虎哥私藏精品🔥

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