逻辑思维 得到 实习面经
逻辑思维 得到
一面
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
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;
}
