年终奖总共23.8w,小组就我和组长两个人,我只拿到 1.67w,组长却拿了22.13w
刚看到个贴子,说的是年终奖分配:组里一共23.8万,就两个人,结果组员拿了1.67万,组长直接拿走22万多,心态当场崩了。
我觉得这事吧,很多网友第一反应都是“不公平”“太离谱”。网友回帖里有人劝他认清现实,说组长本来就拿大头;也有人替他鸣不平,觉得这是赤裸裸的剥削。怎么说呢,我比较认同一半一半。奖金这种东西,本质上就不是按“人数”分的,而是按“权力”和“责任”分的,组长能拍板、能背锅、能对上负责,拿多一点不奇怪。但差距拉到十几倍,确实容易让人寒心。
这件事其实反映了一个老问题:很多公司在分钱这块从不讲清规则,只讲结果。就像去菜市场买菜,不标价,你永远是被宰的那个。从我的角度看,与其事后吐槽,不如早点搞明白自己在团队里的“定价”,不值钱就要想办法涨价,涨不了,也得早点换摊位。
面试题:判断三角形
说三角形这个小算法题啊,说实话,挺像面试里那种“热身题”。但你真要写成代码,又有不少小坑。那我就用聊天的方式,带着你一步步把它撸明白,用 Python 写一版靠谱的。
题目一般就一句话: “给定三条边长 a、b、c,判断它们能不能构成三角形”。
稍微认真一点的话,我们其实可以拆成几个问题:
这三条边能不能构成三角形? 如果能,是等边、等腰,还是普通三角形? 是锐角、直角,还是什么钝角三角形?
很多笔试只要第一个,但你既然写文章,顺手把后面两个也搞了,代码就更完整。
脑子里过一遍初中知识:
边长必须是正数
只要有一条边 ≤ 0,直接判不成立。
三角形不等式(三选一就凉凉):
a + b > c a + c > b b + c > a 三个都要满足,缺一个就构不成三角形。 注意,是 大于,不是大于等于。等于的话是“退化成一条线”。
分类(有了能构成以后再说):
先把三条边按从小到大排序:x ≤ y ≤ z
比较 x² + y² 和 z²:
x² + y² > z²:锐角三角形 x² + y² = z²:直角三角形 x² + y² < z²:钝角三角形
三条边相等:等边 只要有两条相等:等腰 三条都不等:普通(不等边)
边长分类:
角度分类(用勾股定理的变形):
浮点数的时候,等号那块要稍微放宽一点,不然会因为精度问题翻车。
先来最朴素的版本,就回答一句:能,或者不能。
defis_valid_triangle(a: float, b: float, c: float) -> bool:
# 1. 先排除非正数
if a <= 0or b <= 0or c <= 0:
returnFalse
# 2. 三角形不等式
if a + b <= c:
returnFalse
if a + c <= b:
returnFalse
if b + c <= a:
returnFalse
returnTrue
if __name__ == "__main__":
print(is_valid_triangle(3, 4, 5)) # True
print(is_valid_triangle(1, 2, 3)) # False(刚好一条线)
print(is_valid_triangle(2, 2, 5)) # False
这个版本面试里已经能用,但作为一篇文章就有点单薄。咱们稍微豪华一点。
给调用方更多信息会更友好一点,比如返回一个 dict,把各种结果都塞进去。
from typing import Literal, Optional, Dict
import math
TriangleType = Literal["equilateral", "isosceles", "scalene"]
AngleType = Literal["acute", "right", "obtuse"]
defclassify_triangle(a: float, b: float, c: float) -> Dict[str, Optional[str]]:
"""
返回结构示例:
{
"valid": True/False,
"side_type": "equilateral / isosceles / scalene / None",
"angle_type": "acute / right / obtuse / None"
}
"""
result = {
"valid": False,
"side_type": None,
"angle_type": None,
}
# 1. 先校验能不能构成三角形
if a <= 0or b <= 0or c <= 0:
return result
if a + b <= c or a + c <= b or b + c <= a:
return result
result["valid"] = True
# 2. 按边长分类
if a == b == c:
result["side_type"] = "equilateral"
# 等边三角形肯定是锐角,角度类型也可以直接给
result["angle_type"] = "acute"
return result
elif a == b or a == c or b == c:
result["side_type"] = "isosceles"
else:
result["side_type"] = "scalene"
# 3. 按角度分类
# 先升序排序
x, y, z = sorted([a, b, c])
# 用平方避免开根号
x2, y2, z2 = x * x, y * y, z * z
# 浮点数比较,允许一点点误差
eps = 1e-8
if abs(x2 + y2 - z2) <= eps:
result["angle_type"] = "right"
elif x2 + y2 > z2:
result["angle_type"] = "acute"
else:
result["angle_type"] = "obtuse"
return result
if __name__ == "__main__":
print(classify_triangle(3, 4, 5))
# {'valid': True, 'side_type': 'scalene', 'angle_type': 'right'}
print(classify_triangle(2, 2, 3))
# {'valid': True, 'side_type': 'isosceles', 'angle_type': 'acute'}
print(classify_triangle(1, 2, 3))
# {'valid': False, 'side_type': None, 'angle_type': None}
这个函数扔到项目里也很自然:返回结构清晰、可拓展性也不错,后面你要再加个“周长”“面积”字段,直接往 dict 里塞就完事。
真实业务里,数据往往不是你手写的,是接口传进来的,有几个小点可以顺手处理下:
非数字输入:比如从前端来的字符串 "3",你可以先 float() 一下,try/except 包住。极端小数:像 1e-12这种边长,可以根据业务需要直接当 0 处理。单位问题:别一边用厘米一边用米,这种坑倒不是算法本身的,写文档的时候顺嘴强调一下就行。
可以包一层简单的“安全版本”:
defsafe_classify_triangle(a, b, c):
try:
a = float(a)
b = float(b)
c = float(c)
except (TypeError, ValueError):
return {
"valid": False,
"side_type": None,
"angle_type": None,
"error": "invalid input",
}
return classify_triangle(a, b, c)
这样在接口里直接调用 safe_classify_triangle 就比较安心。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB