消掉连续3个相同的字符

题目

// 我有一个字符串,字符串sxsddfsdfdddlll
// 消掉连续3个相同的字符,结果要看不到任意连续3个字符 20分钟

当时的心理分析

这是一道实际的面试题目,我看到这题时,知道铁定凉了。
首先,时间复杂度方面,从头到尾扫一遍是必然的,O(n)是这个题目的极限了,要是说得不对,欢迎指正。
那么这个题目想考察什么呢,无非就是编码规范,编码速度方面的内容。
所以我大概花了8~10分钟的时间迅速完成了这到题,虽然写下了比较糟糕的代码,但主体思路是没什么问题的。
期间面试官似乎在睡觉,提醒面试官的时候,面试官还以为时间差不多了。

让我觉得凉的原因:

  1. 这题不是一道讲究难度的题目,谁都有机会做出来,给一个毕业生去做比较合适。或许我不太了解行情,但以我刚毕业时的水平,这个题目要写出来也是没问题的。对于一个有经验的人来说,做出来后,人家会觉得一个刚毕业的小伙也能做,为什么要招你呢。
  2. 这不是一个普通职位,这道题就算做出来了,也毫无感觉,没有任何加分。人家必然揪着你以往的项目来进行。摆这题的目的只有一个,你项目经历比较一般,而且你看你这么简单的题目都做不好,知难而退吧。

理解上的误区

暂时没有发现对题目的解读存在什么误区。

代码

class A {
    public String handle(String s) {

        if (s == null || s.length() == 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();

        // 当前的相同数目
        int a = 1;
        // 当前的字符
        char c = s.charAt(0);

        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == c) {
                a++;
                if (a == 3) {
                    // 这个字符要消掉的
                    // 直接读下一个
                    if (i + 1 < s.length()) {
                        a = 1;
                        c = s.charAt(i + 1);
                        i++;
                    } else {
                        break;
                    }
                }
            } else {
                // 把c存一下
                while (a > 0) {
                    sb.append(c);
                    a--;
                }
                //保存一下本次的。
                a = 1;
                c = s.charAt(i);
            }
        }
        return sb.toString();

    }


    public static void main(String[] args) {
        //
        String s = "sxsddfsdfdddlll";
        String ss = new A().handle(s);
        System.out.println(ss);
    }
}

这段代码是有问题的
在退出for循环后,没有把遗留的a和c放到结果集里面去。

扩展思考

这道题其实可以有些变形,例如 消掉连续5个相同的字符,假如是这样的题目,是有比O(n)更快一点的思路的。
输入假设为:abcdddddaccccccb
在这里插入图片描述

在这种前提条件下,题目才会变得更加有搞头。可是连续3字符无法产生高效解法。可能存在其他套路解法,例如滑窗解法,或者代码很简洁的解法。但那都很难让人提起兴趣去研究。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章