2016腾讯实习生面试经验(一面二面)

一面

第一部分:自我介绍,简单讲了讲项目啥的。
第二部分:手写几道题。
1)给定一个int型整数a,求出a中从小到大位置有多少连续的0.
做法:判断每一位是否是0,如果是继续判断下一位直到不是0或者超过32位。每一位怎么取呢 a&1结果如果是1,那么这位是1如果是0那么最后一位是0.然后右移。

public int getZeroCount(int a){
    int count = 0;
    int i = 32;
    while(i-->0){
        if(a&1==0){
            count++;
            a = a>>1;
        }else{
            return count;
        }
    }
    return count;
}

2)给定一个字符串比如【{()}】判断是否合法?【{(的顺序一定是先遇到【然后是{然后是(。
那么就是用一个栈,如果是(则直接入栈,如果是{则判断栈,如果栈空或者栈顶事【{则入站否则返回false。如果【则判断栈是否是空或者为【入栈,否则返回false。如果是】}),如果栈空返回false,出栈如果不相等则返回false。最后如果栈不空翻译fasle。

public boolean isLegal(String str){
    if(str==null) return true;
    Stack<Charator> stack = Stack<Charator>();
    for(int i=0;i<str.length();i++){
    char c = str.charAt(i);
        switch(c){
            case '(': stack.push(c);break;
            case '{': 
            if(!stack.isEmpty() && stack.peek()=='(') return false; stack.push(c);break;
            case '[':if(!stack.isEmpty() && stack.peek()!='[') return false;stack.push(c);break;
            default: if(stack.isEmpty()) return false;  if(c!=stack.pop()) return false;
        }
    }
    if(stack.isEmpty()){
    return false;
    }
    return true;
}

3)如何把这个“(1+2)*3/4”计算出来,没想到。

4)镜面翻转一棵二叉树
先序遍历,交换每一个左右节点

public TreeNode reverseTree(TreeNode root ){
    if(root==null) return null;
    TreeNode temp = root.left;
    root.left = root.right;
    root.right = temp;
    reverseTree(root.left);
    reverseTree(root.right);
    return root;
}

5)能不能不用递归?
让我简单说一下思路:那么层序遍历就好了,交换每一个节点的左右子树。

一面大致是从6:00开始面的,不到一个小时,然后7:29收到二面的通知,第二天早上9:40

二面

第一部分:自我介绍,这回项目上问的更加细了,然后也会问java的源码实现。
1)java的hashMap是怎么实现的呢?
我说hashMap是通过一个邻接表的数据结构,然后要put一个(key,value)的时候首先要有一个hashCode函数获取hash值,然后找到数组上的位置,如果该位置上没有节点就直接插入,如果有节点的话就头插。如果要get的时候就对于key值进行hashCode来求得hash值,然后找到数组上面的位置,如果数组上仅有一个那返回该值,如果有其他值的话就搜索。
2)搜索和插入的时间复杂度是多少
搜索的时间复杂的是O(1)+O(k)链表的长度
插入的时间复杂度是O(1)因为找到数组的位置后就直接插入头
3)hashMap是否是线程安全的,怎么实现线程安全呢?
没答上来
4)hashMap里面hashCode有多少种方法呢?
这个其实应该说起、出一种比如int类型的话%数组的长度但是对于string类型的话或者其他自定义类型怎么处理,并不知道。
5)线程安全啥的并不大会。
6)写一道编程题:把abc##ed 仅仅单词翻转。
首先用了split分割,但是面试官告诉我这样没办法获取到空格的个数
然后把str变为StringBuffer 每次分割出一个单词,新建一个word,最后append上result上,面试官说这样内存开销过大。问我怎么解决,当时我sb了。
现在想其实解决的办法很简单,就是翻转操作都发生在原字符串就好了,那么就是在原字符串上找到单词的start和end 然后就反转。

public string reverse(String str){
    StringBuffer newStr= new StringBuffer(str);
    int start=0,end = 0;
    while(start<str.length() ){ //找到单词的start while(start<str.length() && str.charAt(i)==' '){ start++;
        }
        //找到单词的end end = start;
        while(end<str.length && str.charAt(i)!=' '){ end++;
        }
        reverseWord(StringBuffer,start,end);
        start = end;
    }
}
public void reverseWord(StringBuffer str,int start,int end){ if(end<=start){ return;
    }
    while(start<end){ char temp = str.get(i);
        str.set(i,str.get(j));
        str.set(j,temp);
        start++;
        end --;
    }
}

你可能感兴趣的:(经验)