程序员老鬼

比裁员更侮辱人的事情发生了~

刚看到个贴子:公司裁掉部门俩人,一个月薪1万5、一个3万,活全交给留下来的这位,ta顺嘴提了下能不能涨点薪,结果被说成“太功利、没格局”,整个人都被整无语了。

Image

网友回帖我大概扫了下,有说“知足吧,起码你还在”的,也有劝“赶紧跑路别当冤大头”的。怎么说呢,我的看法是:裁员可以理解,业务要有人接也正常,但你多要点报酬,本质是在谈交换,一点都不丢人。

最恶心的不是不给钱,而是一边让你多干活,一边用“团队、感恩、你懂事”来压你。说到底,公司要控制成本,打工人要守住性价比,各有各的算盘,谁也别装圣人。

不过话说回来,能不能涨薪是一回事,敢不敢开口又是另一回事。为自己争取,不丢人,丢人的是把员工当免费劳动力的那一方。

面试题:字母大小写全排列

昨天晚上十一点多吧,我还在公司楼下抽烟,手机啪一下弹个消息:面试题“字母大小写全排列”,就那种你一看觉得简单,真写起来又容易写出一堆 if 的题。我们组小李还在旁边嘀咕“这不就是换大小写么”,我说你别急,这题最坑的点是:数字别动、符号别动、只有字母要分叉,而且分叉是指数级的,你写得不干净就很容易漏或者重复。

我当时脑子里就一个画面:字符串走到第 i 位,碰到字母就有两条路——保持原样、切换大小写;碰到非字母就一条路直接过去。就这么个“路口分叉”的味儿,其实就是回溯。对了,千万别用 String 在递归里疯狂拼接,Java 那个拼接你们懂的吧,GC 一会儿就来敲门了,直接用 char[] 在原地改,改完记得还原,省事。

还有个小细节,别用 c ^ 32 这种骚操作写在公众号里,读者看着像黑魔法,自己两个月后回头看也骂人。老老实实用 Character.toLowerCase / toUpperCase,性能差不了那点,关键是稳。

代码我当时随手敲了个,给你们直接贴,能跑、也好讲,逻辑就像“在走廊里每遇到一个字母就开两扇门”。

import java.util.ArrayList;import java.util.List;publicclassSolution{public List<String> letterCasePermutation(String s){        List<String> ans = new ArrayList<>();if (s == null) return ans;char[] arr = s.toCharArray();        dfs(arr, 0, ans);return ans;    }privatevoiddfs(char[] arr, int idx, List<String> ans){if (idx == arr.length) {            ans.add(new String(arr));return;        }char c = arr[idx];// 不管是不是字母,都可以先走“不变”这条路        dfs(arr, idx + 1, ans);// 如果是字母,再走“翻转大小写”那条路if (Character.isLetter(c)) {char flipped = Character.isUpperCase(c)                    ? Character.toLowerCase(c)                    : Character.toUpperCase(c);if (flipped != c) { // 保险一下,虽然字母一般都会变                arr[idx] = flipped;                dfs(arr, idx + 1, ans);                arr[idx] = c; // 还原现场,不然你就等着出幺蛾子            }        }    }// 随手测一下publicstaticvoidmain(String[] args){        Solution sol = new Solution();        System.out.println(sol.letterCasePermutation("a1b2"));        System.out.println(sol.letterCasePermutation("3z4"));        System.out.println(sol.letterCasePermutation("ABC"));    }}

你看哈,这里我故意先 dfs 一次“不变”,再判断字母走“翻转”,这样写出来分支很直观,不会在代码里出现那种“如果是字母就两个递归否则一个递归”的交错,看着不累。复杂度也别装神秘了:假设有 k 个字母,那就是 2^k 个结果,每个结果长度 n,整体大概 O(n * 2^k),这题你想压也压不下去,因为结果本身就这么多,除非你把结果扔了不返回,那就不叫做题了对吧。

我还见过有人用 BFS,一层层扩展字符串列表,也能过,但我个人不太爱在 Java 里用那种“每层新建一堆 String”的方式,跑起来热闹,线上你就知道谁在制造垃圾了。回溯这种原地改一改,心里踏实。

行了我先不说了,刚刚又有人在群里@我问为啥他输出顺序不一样……顺序这事吧,题目一般不要求,你非要固定顺序那就又是另一套故事了。

-END-