某鹅厂员工在同事圈绝望发文称:被930了,还有房贷,好绝望!
刚看到个贴子,说某鹅厂员工在同事圈发文:“被930了,还有房贷,好绝望”。所谓“930”,就是9月30号合同到期,公司不续签,等于月底就要失业。😢
网友们讨论得挺热闹,有人替他惋惜,也有人说大厂裁员早就是常态。我觉得这事吧,说到底还是职场残酷的一面——你再努力,最终拼的还是能不能留下价值。像有些网友说的,打工人最怕的不是忙,而是突然被通知“没你了”。
不过话说回来,这种情况谁都可能遇上,没必要过度自责。职场就是一场博弈,公司算的是性价比,我们要算的是兜底能力。房贷压力确实大,但也提醒大家,别把鸡蛋放一个篮子里,提前准备副业收入或提升核心技能,才有底气应对突发。
总的来说,失业不等于失能,把当下的焦虑转化为动力,也许就是新的开始。【备注:文末可领最新资料】
面试题:账户余额
题眼基本就俩——怎么累计、怎么判规则。常见输入就是一堆操作(存、取、手续费、利息、转账),问你最后余额,或者第几步变成负数、被拒绝之类。别急着上代码,先把“业务规约”钉死,否则越写越乱。
金额精度:用 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 全部免费领