Python技术迷

某鹅厂员工在同事圈绝望发文称:被930了,还有房贷,好绝望!

刚看到个贴子,说某鹅厂员工在同事圈发文:“被930了,还有房贷,好绝望”。所谓“930”,就是9月30号合同到期,公司不续签,等于月底就要失业。😢

Image

网友们讨论得挺热闹,有人替他惋惜,也有人说大厂裁员早就是常态。我觉得这事吧,说到底还是职场残酷的一面——你再努力,最终拼的还是能不能留下价值。像有些网友说的,打工人最怕的不是忙,而是突然被通知“没你了”。

不过话说回来,这种情况谁都可能遇上,没必要过度自责。职场就是一场博弈,公司算的是性价比,我们要算的是兜底能力。房贷压力确实大,但也提醒大家,别把鸡蛋放一个篮子里,提前准备副业收入或提升核心技能,才有底气应对突发。

总的来说,失业不等于失能,把当下的焦虑转化为动力,也许就是新的开始。【备注:文末可领最新资料】

面试题:账户余额

题眼基本就俩——怎么累计、怎么判规则。常见输入就是一堆操作(存、取、手续费、利息、转账),问你最后余额,或者第几步变成负数、被拒绝之类。别急着上代码,先把“业务规约”钉死,否则越写越乱。

  • 金额精度:用 Decimal,千万别用 float。
  • 取款规则:两种流派 1)拒绝透支:余额不够则该操作无效; 2)允许透支:允许负数,可能还要收透支费。 代码里做成参数,就不怕题目变体。
  • 手续费/利息:可能是固定额也可能是按比例。比例要先转成 Decimal('0.005') 这种。
  • 时间顺序:按给定顺序执行;有些题会给日期,你就照顺序来,不要排序(除非题干明确说乱序)。
  • 输出:有的要最终余额,有的要第一个失败/变负的下标,两者都支持更保险。
from decimal import Decimal, getcontext
from typing import List, Tuple, Optional

getcontext().prec = 28# 足够大,避免精度问题

Op = Tuple[str, List[str]]  
# 规范化:('deposit', ['100.00']) / ('withdraw', ['30']) / ('fee', ['2.5'])
#        ('interest', ['0.005']) 代表 +0.5% ;('transfer', ['-20']) 也可当取款

classBalanceEngine:
def__init__(
        self,
        start: str = "0",
        overdraft_mode: str = "reject",    # 'reject' | 'allow'
        overdraft_fee: str = "0",          # 允许透支时,首次进入负数收一次费;可设为0关闭
        reject_on_negative: bool = False,  # 若题目要求一旦<0就报告位置并停止
        scale: int = 2# 保留小数位,通常是分
    )
:

        self.balance = Decimal(start)
        self.overdraft_mode = overdraft_mode
        self.overdraft_fee = Decimal(overdraft_fee)
        self.reject_on_negative = reject_on_negative
        self.scale = scale
        self._charged_overdraft_fee = False# 只收一次

def_q(self, x: Decimal) -> Decimal:
return x.quantize(Decimal((0, (1,), -self.scale))) if self.scale >= 0else x

defapply(self, ops: List[Op]) -> Tuple[Decimal, Optional[int], Optional[int]]:
"""
        返回: (最终余额, 第一次失败的操作下标, 第一次变负的操作下标)
        如果没有就返回 None
        """

        first_fail = None
        first_negative = None

for i, (typ, args) in enumerate(ops):
if typ == 'deposit':
                amt = Decimal(args[0])
                self.balance += amt

elif typ in ('withdraw', 'transfer'):
                amt = Decimal(args[0])
# 统一成取款为负、存款为正更安全
                out = -amt if amt < 0else amt
if self.overdraft_mode == 'reject'and self.balance < out:
                    first_fail = first_fail if first_fail isnotNoneelse i
continue
                self.balance -= out

elif typ == 'fee':
                fee = Decimal(args[0])
                self.balance -= fee

elif typ == 'interest':
                rate = Decimal(args[0])  # 比如 0.005 是 +0.5%
                self.balance = self.balance * (Decimal('1') + rate)

else:
# 未知操作,按失败处理
                first_fail = first_fail if first_fail isnotNoneelse i
continue

# 进位/截断
            self.balance = self._q(self.balance)

# 允许透支时,首次进入负数收一次费
if self.overdraft_mode == 'allow'and self.balance < 0and self.overdraft_fee > 0andnot self._charged_overdraft_fee:
                self.balance -= self.overdraft_fee
                self.balance = self._q(self.balance)
                self._charged_overdraft_fee = True

# 题目要求一旦负数就停止并记录
if self.reject_on_negative and self.balance < 0and first_negative isNone:
                first_negative = i
break

return self._q(self.balance), first_fail, first_negative

# 小示例
if __name__ == "__main__":
    ops: List[Op] = [
        ('deposit',  ['100.00']),
        ('withdraw', ['30']),
        ('fee',      ['2.50']),
        ('interest', ['0.005']),   # +0.5%
        ('withdraw', ['80']),      # 看看是否触发失败/透支
    ]
    engine = BalanceEngine(start="0", overdraft_mode="reject", reject_on_negative=False)
    bal, fail_idx, neg_idx = engine.apply(ops)
    print("balance=", bal, "fail_at=", fail_idx, "negative_at=", neg_idx)
  • 状态只有一个:余额。遇到操作就纯函数式地“折叠”进去,时间复杂度 O(n)。
  • 规则当参数:是否允许透支、是否立刻判负、透支费金额、精度位数,题目变体只改入参,不改算法。
  • 精度与舍入:每步都量化到分位,避免连乘连减后出现 0.009999 之类脏值。
  • 失败与负数的两个指标:既能回答“最终余额”,也能回答“哪一步挂了”。

够用了。真遇到带日期利息、结息日、分段费率的怪题,把“interest”变成带上下文的操作(比如按天循环算),这套骨架照样顶得住。

-END-

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

🔥虎哥私藏精品🔥

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