消掉连续3个相同的字符

题目

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

当时的心理分析

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

让我觉得凉的原因:

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

理解上的误区

这是一道文字游戏题,正确理解题意很重要。
重点是在于结果要看不到任意连续3个字符。
也就是说,需要进行连续消除的处理。
假设输入用例:sxsddfsdfdddlllff
消一次后:sxsddfsdfff
最后那三个f仍然要继续消掉,变成:sxsddfsd

所以,这道题是一道很好展现个人编程水平的题目,硬生生给错过了。

当时写的代码

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放到结果集里面去;并且没有进行连续消除。

正解

用栈进行消除,再将结果输出。数据结构用Deque即可解。这里就不贴代码了,只要正确理解题意,20分钟解题绰绰有余。

扩展思考

这道题其实可以有些变形,例如 消掉连续5个相同的字符,假如是这样的题目,会多出点骚操作。
输入假设为:abcdddddaccccccb
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值