逻辑思维 得到 实习面经

逻辑思维 得到
一面
1  实现无括号的4则运算表达式
中缀式:(a+b+c*d)/e
后缀式:abcd*++e/
前缀式:/++ab*cde
可以将表达式默认存到树里面
然后树节点后序遍历完成
代码附上
class TreeNode {
        char val;
        TreeNode left;
        TreeNode right;
        TreeNode(char x) { val = x; }
    }
    public int comp(TreeNode p) throws Exception {
        int a,b;
        if(p!=null){
            if(p.left!=null && p.right!=null){
                a = comp(p.left);
                b = comp(p.right);
                return cal(a,b,p.val);
            }else{
                return p.val - '0';
            }
        }else {
            return 0;
        }
    }

    private int cal(int a, int b, char op) throws Exception {
        if(op == '+') return a+b;
        if(op == '-') return a-b;
        if(op == '*') return a*b;
        if(op == '/'){
            if(b==0){
                throw  new Exception();
            }
            return a/b;
        }
        return 0;
    }        
2 进程和线程的区别
3 什么是僵尸进程, 僵尸进程是怎么产生的?
4 线程同步的方式?
5 进程通信的方式?
6 什么是缓冲区溢出,缓冲区溢出的原因有哪些, 有什么危害?
7 TCP 建立连接的过程
8 TIME_WAIT, CLOSE_WAIT 可能是什么原因?
9  HTTP协议为什么基于TCP协议设计实现
10 索引是什么?有什么作用以及优缺点?
11 简单说一说drop、delete与truncate的区别
12 设一表user_buy_record,字段包含用户ID(UID), 商品ID(product_id)
create table user_buy_record(
    uid int(11) , 
    product_id int(11),
    create_time int(11),_
    update_time int(11)_
)
12.1 找出购买一个商品大于2次的用户id
12.2 列最近购买的前10个用户ID
13 判断一个链表是否是回文结构
两种方法  1快慢指针加反转  2使用栈来实现
    public boolean isPalindrome(ListNode head) {
        if(head == null && head.next == null){
            return true;
        }
        ListNode slow = head,fast = head;
        ListNode p=null,pre = null;
        while (fast!=null&&fast.next==null){
            p = slow;
            slow = slow.next; //快慢遍历
            fast = fast.next.next;
            p.next = pre; //翻转前半部分
            pre = p;
        }
        if(fast!=null){    //如果是奇数跳过奇数节点
            slow = slow.next;
        }
        while(p!=null){  //前半部分和后半部分进行比较
            if(p.val!=slow.val){
                return false;
            }
            p = p.next;
            slow = slow.next;
        }
        return true;
    }



二面
1、十进制: 937,使用八进制表示是:
2、投掷一个筛子,连续出现两个相同数字的概率为: a. 1/6    b. 1/36    c. 1/12    d. 以上都不是
3、一个袋中有10个球,黑球3个白球7个,先从袋中取任意一球(不放回去),接下来再取一次是黑球的概率是:
a. 1/10    b. 1/9    c. 2/10    d. 3/10
4、随意给定一组不知道个数的数字(有重复),写一个算法,找到出现次数最多的3个数字(不限语言)
使用大顶堆来实现
//给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
    public List<Integer> topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            if(map.containsKey(num)){
                map.put(num,map.get(num)+1);
            }else{
                map.put(num,1);
            }
        }
        PriorityQueue<Integer> heap = new PriorityQueue<>((n1,n2)->map.get(n2)-map.get(n1));
        for (Integer num : map.keySet()) {
            heap.add(num);
        }
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < k; i++) {
            list.add(heap.poll());
        }
        return list;
    }

#后端实习面经##得到##实习##Java工程师##面经#
全部评论
这是哪个岗位的面试题
点赞
送花
回复
分享
发布于 2020-08-16 14:58

相关推荐

1 9 评论
分享
牛客网
牛客企业服务