两个摄像头监控我,离项后公司对我进行劝退,没有合理赔偿我不同意,公司现在把我工位用两个摄像头对我进行监控。。
刚看到个贴子,说的是:当事人被公司劝退,因为赔偿谈不拢没同意,结果公司直接把人丢会议室,还安了两台摄像头全程监控,挺窒息的。
网友们的回复我看了看,有说“赶紧走人别受气”的,也有建议“取证走仲裁”的,我比较认同后者。情绪上谁看了都憋屈,但真到这一步,吵架没用,关键是证据和法律。
我觉得这事吧,已经不是简单的“管理需要”,而是变相逼你走人,属于典型的职场冷暴力。如果真有监控、调岗记录、聊天记录,这些都是很好用的证据,可以去咨询专业人士,了解劳动仲裁怎么走,而不是被动挨打。
公司可以不要你,但不能随便羞辱你。人不一定要硬刚,但底线要靠法律挺住。
面试题:相隔为 1 的编辑距离
给你两个字符串 s 和 t,问一句: “我最多只动一次,能不能把 s 变成 t?”
这一次操作可以是三种里的一个:
插入一个字符: ab→ 插入'c'→acb删除一个字符: abc→ 删掉'b'→ac替换一个字符: abc→ 把'b'改成'd'→adc
如果正好一步能变成,叫“编辑距离为 1”; 两步以上、或者 0 步(完全一样)都算不行。
这个题有个很关键的观察: 编辑距离为 1,其实只会出现这三种长度关系:
|len(s) - len(t)| > 1→ 一步肯定搞不定,直接falselen(s) == len(t)→ 只可能是“替换一个字符”len(s) + 1 == len(t)或len(t) + 1 == len(s)→ 只可能是“插入/删除一个字符”(插入和删除是互为逆操作)
所以代码结构可以写成:
先看长度差:
差大于 1:false
长度相等:检查是否刚好有 1 个位置不一样
长度差为 1:检查是否刚好多了 / 少了 1 个字符
长度相等的情况:只能是“替换”
比如:abc 和 adc
我们从左到右扫一遍:
遇到字符相同:没事,继续
遇到字符不同:把“发现不同次数 +1”
扫完:
如果一共只发现了1 次不同 → 可以通过一次“替换”搞定 → true如果是 0 次不同 → 说明两个字符串一模一样,编辑距离是 0 → false如果 ≥ 2 次不同 → 一次替换不够用 → false
长度差为 1 的情况:只能是“插入/删除”
比如:
s = "abc",t = "abdc":t比s多一个字符'd'你可以理解为:从 t删掉一个字符,可以变成s
这种情况可以用“双指针”:
先保证
s是更短的那个字符串(如果不是,就交换一下)用两个指针
i指向s,j指向t从左到右比较:
这说明 t在这里多了一个字符 → 让j++,i不动 → 表示“尝试在这里删除t的这个多出来的字符”
如果
s.charAt(i) == t.charAt(j):两个指针都往后走不一样的时候就“使用了一次机会”:
期间如果发现“用了两次机会” → 说明怎么删都对不上 → false
扫完之后,如果整个过程中最多只错开了一次 → true
注意一个边界场景:
s = "ab",t = "abc": 前两位都相同,最后t多一个'c'我们的算法会扫到i == len(s)提前结束,此时其实也只用了一次“插入”,逻辑上是 OK 的。
直接给一个完整的方法,可以丢到 class Solution 里面:
publicclassSolution{
publicbooleanisOneEditDistance(String s, String t){
int m = s.length();
int n = t.length();
// 长度差超过 1,肯定不是一步能到
if (Math.abs(m - n) > 1) {
returnfalse;
}
// 长度相等 → 只能是“替换”
if (m == n) {
return isOneReplace(s, t);
}
// 长度差为 1 → 只能是“插入/删除”
// 为了方便处理,保证 s 是更短的那个
if (m > n) {
return isOneInsert(t, s); // 交换一下
} else {
return isOneInsert(s, t);
}
}
// 长度相等时,判断是否正好有 1 个位置不同
privatebooleanisOneReplace(String s, String t){
int diff = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != t.charAt(i)) {
diff++;
if (diff > 1) {
returnfalse;
}
}
}
// 必须刚好是 1 个不同,0 个不同说明一样,不算
return diff == 1;
}
// 已经保证:shorter.length + 1 == longer.length
// 看能不能通过在 longer 删掉 1 个字符变成 shorter
privatebooleanisOneInsert(String shorter, String longer){
int i = 0; // shorter 的指针
int j = 0; // longer 的指针
boolean edited = false; // 是否已经“用掉”一次机会
while (i < shorter.length() && j < longer.length()) {
if (shorter.charAt(i) == longer.charAt(j)) {
i++;
j++;
} else {
if (edited) {
// 已经有过一次不对齐了,又遇到一次,说明不止一步
returnfalse;
}
// longer 在 j 位置多了一个字符,尝试“跳过”它
edited = true;
j++;
}
}
// 走到这里,要么中途用了一次“跳过”,要么没用
// 如果没用过 edited=false,那么多出来的那个字符在 longer 的末尾
returntrue;
}
// 简单测几组
publicstaticvoidmain(String[] args){
Solution s = new Solution();
System.out.println(s.isOneEditDistance("abc", "ab")); // true 删除
System.out.println(s.isOneEditDistance("ab", "abc")); // true 插入
System.out.println(s.isOneEditDistance("abc", "adc")); // true 替换
System.out.println(s.isOneEditDistance("abc", "abc")); // false 距离为 0
System.out.println(s.isOneEditDistance("abc", "abxx")); // false 距离大于 1
}
}
时间复杂度:最多就两根指针从左到右扫一遍, O(n),n是较短字符串的长度空间复杂度:只用到几个变量, O(1)
这个题其实不难,难在一开始容易下意识去写“完整编辑距离 DP”, 但一旦意识到“只要判断是不是刚好 1 步”,就可以用这个很轻量的双指针写法,代码也挺好维护的。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html