题目
// 我有一个字符串,字符串sxsddfsdfdddlll
// 消掉连续3个相同的字符,结果要看不到任意连续3个字符 20分钟
当时的心理分析
这是一道实际的面试题目,我看到这题时,知道铁定凉了。
首先,时间复杂度方面,从头到尾扫一遍是必然的,O(n)是这个题目的极限了,要是说得不对,欢迎指正。
那么这个题目想考察什么呢,无非就是编码规范,编码速度方面的内容。
所以我大概花了8~10分钟的时间迅速完成了这到题,虽然写下了比较糟糕的代码,但主体思路是没什么问题的。
期间面试官似乎在睡觉,提醒面试官的时候,面试官还以为时间差不多了。
让我觉得凉的原因:
- 这题不是一道讲究难度的题目,谁都有机会做出来,给一个毕业生去做比较合适。或许我不太了解行情,但以我刚毕业时的水平,这个题目要写出来也是没问题的。对于一个有经验的人来说,做出来后,人家会觉得一个刚毕业的小伙也能做,为什么要招你呢。
- 这不是一个普通职位,这道题就算做出来了,也毫无感觉,没有任何加分。人家必然揪着你以往的项目来进行。摆这题的目的只有一个,你项目经历比较一般,而且你看你这么简单的题目都做不好,知难而退吧。
理解上的误区
暂时没有发现对题目的解读存在什么误区。
代码
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字符无法产生高效解法。可能存在其他套路解法,例如滑窗解法,或者代码很简洁的解法。但那都很难让人提起兴趣去研究。