清华硕士天塌了,根本找不到合适的工作。。
刚看到个贴子,说清华硕士找工作受挫,本来想进自动驾驶行业,和地平线面了三轮聊得挺顺,结果一个月后还是挂了。民企卷到不行,国企又一点消息都没有,搞得人心态直接崩。刷了一堆leetcode,结果发现真到面试里也没啥用。
我觉得这事吧,说白了就是大环境太卷,学历已经不是“免死金牌”,企业更看重能不能马上创造价值。网友有人感慨努力都白搭,但我觉得也不能太悲观。leetcode确实不等于能力,但练习至少能让你保持基本功,只是要懂得结合实际项目经验。
换个角度想,民企是赛马场,竞争激烈;国企像围城,门口挤满人信息还不透明。与其纠结哪里更好,不如先把自己定位清楚,提升核心竞争力。就业市场就是场长跑,不是百米冲刺。【备注:文末可领最新资料】
算法题:两个字母卡牌游戏
昨晚十一点多我在公司楼下吹风,手机电量只剩9%,小李还在群里问那个…两个字母的卡牌题怎么写。就是每张卡上有两个字母,比如正面是 a,背面是 b,卡牌顺序固定不能换,给你一串目标串 t,问能不能把每张卡翻或不翻,拼成 t。听着挺像儿戏,对吧,但写起来老有人绕晕。
先把意思讲清:第 i 张卡有一对 (front[i], back[i]),目标串 t 长度等于卡牌数 n。你在第 i 位只能选 front[i] 或 back[i],看能不能让整串等于 t。顺便再问个进阶:有几种翻法能成功?能的话随便还原一种出来给面试官看看,别光说嘴上会。
思路其实很“数豆子”。位置独立,每个 i 位,看看 t[i] 和这张卡的两个字母的关系: 1)都不等——这条路死了,直接失败; 2)只匹配其一——这位的选择被迫唯一; 3)两个都匹配——这位自由选择两种,后面还要乘法原理累积。
所以判断可行性就线性扫一遍;计数就把每个“可二选一”的位置乘起来。为了能还原一条具体方案,我一般这样搞:扫的时候若只有一个选项就记下来;若有两个,我统一偏向选 front(或者谁字典序小谁都行),这样最后就能复原一条确定的解。复杂度 O(n),没坑。
等等我刚接了个电话…好继续说代码。Java 写起来就两件事:计数可能很大,面试里常见取模 1e9+7;还有就是把一条可行拼法顺手还原出来,这样 demo 更好看。
下面这个小程序,输入三行:第一行 n,第二行两个长度为 n 的字符串 s 和 r(分别当作每张卡的正反),第三行目标串 t。输出是:能不能,多少种(取模),以及随手给你一条拼出来的串。要是不行就打印 NO。
import java.io.*;
import java.util.*;publicclassMain{
staticfinallong MOD = 1_000_000_007L;
publicstaticvoidmain(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line1 = br.readLine();
while (line1 != null && line1.trim().isEmpty()) line1 = br.readLine();
int n = Integer.parseInt(line1.trim());
String s = br.readLine().trim(); // 正面
String r = br.readLine().trim(); // 背面
String t = br.readLine().trim(); // 目标
if (s.length() != n || r.length() != n || t.length() != n) {
System.out.println("NO");
return;
}
long ways = 1;
char[] pick = newchar[n];
boolean ok = true;
for (int i = 0; i < n; i++) {
char a = s.charAt(i);
char b = r.charAt(i);
char need = t.charAt(i);
boolean m1 = (a == need);
boolean m2 = (b == need);
if (!m1 && !m2) {
ok = false; break;
} elseif (m1 && m2) {
// 两边都能,计数乘2,方案任选其一(这里偏向正面)
ways = (ways * 2) % MOD;
pick[i] = a; // 选正面
} elseif (m1) {
pick[i] = a;
} else {
pick[i] = b;
}
}
if (!ok) {
System.out.println("NO");
} else {
System.out.println("YES");
System.out.println(ways);
System.out.println(new String(pick));
}
}
}
有人会问,那要是目标串长度跟卡牌数不一样呢,或者想从 n 张卡里挑一部分去拼 t?这个就不是上面那个“每位独立”的模型了,味道更像匹配子序列:双指针从左到右,卡牌每张能贡献两个候选字母里其一,尽量去喂 t 的当前字符,能喂满就 OK,否则失败;计数的话要上 DP,定义 dp[i][j] 表示用前 i 张卡拼到 t 的前 j 位的方案数,转移看第 i 张卡的两个字母哪个等于 t[j-1],把能接上的路都加起来,复杂度 O(n * |t|),这个面试时看时间再展开,不然估计要超时我下楼打车了。
总之,这题的核心就是别把它想成全局搜索,按位拆开就很干净。好了我先去热杯咖啡,眼睛有点花,等会儿谁要是把输入改成多组数据…呃那 main 外再包一层循环就行,别吓我。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html