https://docs.google.com/document/d/1qxA2wps0IhVRWULulQ55W4SGPMu2AE5MkBB37h8Dr58/
第二轮:白人小哥,先狂问了一些java基础和ood的基础,java中的多继承,什么是封装,composition(聚合)和继承什么区别,什么是多态,java中什么是checked exception,什么是runtime exception。其他的记不起来了,因为我说我主语言是java,恰好小哥也很喜欢java,所以这轮问我基础问得很多。然后是做题,string deduplication的变种,给一个string,保证全是大小写英文字母,当出现同一个字母的一个大写挨着一个小写时候,消除掉这个pair。
比如:
abBCcd -> return ad
abBCcAd -> return d
思路:双指针直接o(n)时间o(1)空间解出来,slow指针用来模拟栈的结构,每次检查slow-1字母和当前字母是否是同一个字母的大小写,是的话弹栈,不是的话当前字母进栈。很常规的字符串处理方法。
当时写的code:
String deduplicate(String str) {
// sanity check, 也是和面试官讨论了下,说不用写了,直接写主函数
char[] s = str.toCharArray();
int slow = 0;
int fast = 0;
while(fast < s.length) {
if(slow == 0) {
s[slow++] = s[fast];
} else {
if(Character.isUpperCase(s[slow -1]) && Character.isLowerCase(s[fast]) || Character.isLowerCase(s[slow-1]) && Character.isUpperCase(s[fast])) {
char c1 = Character.toLowerCase(s[slow-1]);
char c2 = Character.toLowerCase(s[fast]);
if(c1 == c2) {
slow--;
} else {
s[slow++] = s[fast];
}
}
else{
s[slow++] = s[fast]
}
}
fast++;
return new String(s, 0, slow);}
}