程序员老鬼

两个摄像头监控我,离项后公司对我进行劝退,没有合理赔偿我不同意,公司现在把我工位用两个摄像头对我进行监控。。

刚看到个贴子,说的是:当事人被公司劝退,因为赔偿谈不拢没同意,结果公司直接把人丢会议室,还安了两台摄像头全程监控,挺窒息的。

Image

网友们的回复我看了看,有说“赶紧走人别受气”的,也有建议“取证走仲裁”的,我比较认同后者。情绪上谁看了都憋屈,但真到这一步,吵架没用,关键是证据和法律。

我觉得这事吧,已经不是简单的“管理需要”,而是变相逼你走人,属于典型的职场冷暴力。如果真有监控、调岗记录、聊天记录,这些都是很好用的证据,可以去咨询专业人士,了解劳动仲裁怎么走,而不是被动挨打。

公司可以不要你,但不能随便羞辱你。人不一定要硬刚,但底线要靠法律挺住。

面试题:相隔为 1 的编辑距离

给你两个字符串 s 和 t,问一句: “我最多只动一次,能不能把 s 变成 t?”

这一次操作可以是三种里的一个:

  1. 插入一个字符:ab → 插入 'c' → acb
  2. 删除一个字符:abc → 删掉 'b' → ac
  3. 替换一个字符:abc → 把 'b' 改成 'd' → adc

如果正好一步能变成,叫“编辑距离为 1”; 两步以上、或者 0 步(完全一样)都算不行。

这个题有个很关键的观察: 编辑距离为 1,其实只会出现这三种长度关系:

  1. |len(s) - len(t)| > 1→ 一步肯定搞不定,直接 false
  2. len(s) == len(t)→ 只可能是“替换一个字符”
  3. 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

这种情况可以用“双指针”:

  1. 先保证 s 是更短的那个字符串(如果不是,就交换一下)

  2. 用两个指针 i 指向 s,j 指向 t

  3. 从左到右比较:

  • 这说明 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

    最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领,也可以链接我微信:hls404