离职证明上,公司给了负面信息该怎么办
离职证明这玩意,本来就该写得像白开水,姓名、岗位、在职时间,顶多再来一句“双方解除劳动关系”。
结果有些公司非要夹带私货,顺手给你塞一句“表现一般”“不服从管理”,这就不是证明了,这是临走还想补一刀。
离职都办完了,还想靠一张纸拿捏人。很多HR看到这种证明,第一反应不是你有问题,是你前司戏太多。真碰上了别慌,先留证据,要求公司重新开;不改就去劳动监察或者仲裁。
离职证明不是差评区,别让他们拿废话卡你下家。
算法题:文本左右对齐
这题看着像字符串处理,真写的时候最容易翻车的不是“往哪边补空格”,而是最后一行、单词放不下时怎么结算,以及只有一个单词那一行到底算不算均匀分配。
我一般不太信那种一上来就开始拼字符串的写法。因为这种题逻辑分两段:先分组,确定这一行能塞几个单词;再格式化,决定这一行空格怎么分。你把这两件事揉在一个 while 里,后面十有八九会在边界上绕晕。这个写法风格和我平时处理日志切片、批量导出分段差不多,先把段落切出来,再单独处理段内规则。整体思路也就顺了。
题目的要求其实就三条:
第一,普通行要左右对齐,也就是尽量塞满 maxWidth。 第二,单词之间的空格要尽量平均,左边的空隙允许比右边多一个。 第三,最后一行不用硬拉满间距,正常左对齐,末尾补空格即可。
先看核心代码,我自己习惯这么写:
from typing import List
classSolution:
deffullJustify(self, words: List[str], maxWidth: int) -> List[str]:
ans = []
n = len(words)
i = 0
while i < n:
line_len = len(words[i])
j = i + 1
# 先确定这一行能放多少个单词
while j < n and line_len + 1 + len(words[j]) <= maxWidth:
line_len += 1 + len(words[j])
j += 1
row = words[i:j]
word_len = sum(len(w) for w in row)
gaps = len(row) - 1
# 最后一行,或者这一行只有一个单词:左对齐
if j == n or gaps == 0:
s = " ".join(row)
s += " " * (maxWidth - len(s))
ans.append(s)
else:
total_spaces = maxWidth - word_len
avg = total_spaces // gaps
extra = total_spaces % gaps
parts = []
for k, w in enumerate(row[:-1]):
parts.append(w)
# 左边多分配 extra 个空格
parts.append(" " * (avg + (1if k < extra else0)))
parts.append(row[-1])
ans.append("".join(parts))
i = j
return ans
这段代码里,最关键的是这两步:
total_spaces = maxWidth - word_len
avg = total_spaces // gaps
extra = total_spaces % gaps
比如这一行是 ["This", "is", "an"],maxWidth = 16。 单词总长度是 4 + 2 + 2 = 8。 那就还剩 8 个空格,要塞到 2 个缝里。 平均每个缝 4 个,余数 0,直接平分。
再比如 ["what","must","be"],总长度 4 + 4 + 2 = 10,宽度 16,还剩 6 个空格,两个缝一个 3、一个 3,也没问题。 麻烦一点的是分不匀的时候,比如剩 7 个空格,2 个缝,那就是左边 4 个,右边 3 个。题目要的就是这个味道,不是“四舍五入”,也不是“随便补”。
我见过有人最后一行也按普通行分空格,输出会变成单词被拉开,样子很怪。最后一行其实很简单:
s = " ".join(row)
s += " " * (maxWidth - len(s))
这个写法挺稳,先按正常阅读方式拼起来,右边不够再补。别上来自己数每个单词后面该补几个空格,没必要给自己找事。
这题时间复杂度是 O(n),每个单词基本只进出一遍。空间复杂度除了结果集,额外开销也不大。
这种题拿去面试,不是考你会不会 join,是看你有没有把规则拆开处理。字符串题一旦规则多,最怕逻辑缠在一起。