Python技术迷

离职证明上,公司给了负面信息该怎么办

离职证明这玩意,本来就该写得像白开水,姓名、岗位、在职时间,顶多再来一句“双方解除劳动关系”。

结果有些公司非要夹带私货,顺手给你塞一句“表现一般”“不服从管理”,这就不是证明了,这是临走还想补一刀。

Image

离职都办完了,还想靠一张纸拿捏人。很多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,是看你有没有把规则拆开处理。字符串题一旦规则多,最怕逻辑缠在一起。