Sgg:字节跳动大数据研发实习一面凉经
今天11月22日。我第一次正式面试。之前也投了很多,但是都没有 消息,其实我是不想这么早投递大公司拿来练手的,但是认识一个学长有内推,机会挺好的,而且一次不过也不至于拉入黑名单,所以我就想试试了,但是我还真的挺想拿下的,我知道自己水平不够,差很远,对结果也有了一个预料。面试我的是一个很有程序员特点的小哥,像个宅男,胡子也不刮。技术宅!
1.自我介绍
数学专业 热爱大数据 热爱技术 蹭课自学 选修图书馆借书 问我为什么不转专业之类的。
现在后悔这么说啦,因为不要说是自己自学的除非他问 ,直接把这个问题略过就好。否则人家会认为你基础很不扎实,虽然的确是这样。
2.单链表对折
1->2->3->4->5
1->5->2->4->3
我说把中间之后的存到数组里,之后把中间之后的删掉。
然后在隔一个存一个。
人家说不行。时间复杂度空间复杂度都太高。问我是多少,我一下子有点懵,因为从来没真正搞懂过时间和空间复杂度。于是自己写了一篇博客:
Sgg:时间和空间复杂度
他提示我截下来然后反转之后再加进去上。
我捣鼓半天,想查查百度还被发现了。。。。
凉凉 还得是我回来自己想想查查
自己写的::::其中反转我使用了栈的特性:
明天我要看看链表的反转。
package problem;
import java.util.Stack;
/*
* 链表对折 字节实习一面
* 1->2->3->4->5
* 1->5->2->4->3
*/
public class A_LinkedList_1122 {
//定义链表节点
public static class ListNode{
int value;
ListNode next;
public ListNode(int number){
this.value = number;
}
}
public static ListNode reorderList(ListNode head) {
//这个循环是为了找到链表的中间节点
ListNode slow = head;
ListNode fast = head;
while( fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode record = slow;
//此时 slow处于单链表的中间结点并记录
//使用栈stack进行装取slow之后的所有节点 到时候再用stack pop取出来就行了
Stack<ListNode> stack = new Stack<>();
while(slow.next != null) {
slow = slow.next;
stack.push(slow);
}
slow = null;
ListNode current = head;
while (current != null && !stack.isEmpty()) {
ListNode next = current.next;
current.next = stack.pop();
current.next.next = next;
current = next;
if(current.value == record.value) {
current.next = null;
break;
}
}
return head;
}
public static void main(String[] args) {
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(3);
ListNode n4 = new ListNode(4);
ListNode n5 = new ListNode(5);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
ListNode n = reorderList(n1);
do {
System.out.println(n.value);
n = n.next;
}while(n!=null);
}
}
链表反转:
/*
* 链表反转
*/
public ListNode reverseList(ListNode n) {
ListNode newListNode = null;
ListNode temp = null;
while(n != null) {
temp = n.next;
n.next = newListNode;
newListNode = n;
n = temp;
}
return newListNode;
}
3 .hdfs读写原理 删除数据?
这个说的不太好 我说了说nn 和 2nn 的原理 怎么读写数据的。
人家重点问我是怎么删除数据,这个我不会。
读数据流程
- 客户端向namenode请求读取数
- namenode相应可以读取并返回数据元数据
- 一个block块一个block块的读取数据。
向datanode请求读取第一个block块。 - 传输数据.
写数据流程
5. 客户端向namenode请求上传文件
6. namenode返回可以上传文件
7. 客户端请求上传第一个block
8. namenode返回可以上传的数据节点
9. 依次请求建立连接通道
10. datanode应答
11. 上传数据
hdfs删除数据?
HDFS中的数据并不是直接删除,而是存到一个叫做\trash。可供恢复。
用户想要删除的数据和文件要存到/trash。当过了一定的时间周期之后(6小时),才会删除。
此时namenode才会修改元数据信息。Datanode上的相关空间才会得到释放。
4. 线程之间的通信
太久没复习了 忘记啦 瞎扯的
wait():使线程阻塞,直到使用同一把锁的其他线程将其唤醒
notify():唤醒wait池中某个线程 使他进入锁池状态
notifyAll():唤醒所有线程
进程之间的通信
面试官说属于操作系统的知识,我说我没学过操作系统。。。。
管道,消息队列,共享内存,信号量,socket,信号,文件锁
来自博客分享
5.ThreadLocal
(没听说过 不会)
threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据
6.MySQL innodb 索引
Innodb是MySQL的一个引擎。支持事务处理,支持外键,支持崩溃修复能力和并发控制。线程安全,支持外键,但是不支持全文索引。
InnoDB的索引为聚集索引,索引文件和数据文件是在一起的。聚集索引是将数据按物理存储分区,查找的时候能够锁定一小块物理空间然后再找。
MySQL索引:
7.hashmap存储原理
回答很明白
负载因子:75%
链表长度大于7自动升级未红黑树
8.你还有什么需要问的?
我:面试官,我有哪些薄弱的环节?我回答的不太好,给我点建议吧!
小哥:加强基础!!!!