Sgg:字节跳动大数据研发实习一面凉经

  • 1.自我介绍
  • 2.单链表对折
  • 3 .hdfs读写原理 删除数据?
  • 4. 线程之间的通信
  • 进程之间的通信
  • 5.ThreadLocal
  • 6.MySQL innodb 索引
  • 7.hashmap存储原理
  • 8.你还有什么需要问的?



今天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 的原理 怎么读写数据的。

人家重点问我是怎么删除数据,这个我不会。

smbios字节 sg字节_数据

读数据流程

  1. 客户端向namenode请求读取数
  2. namenode相应可以读取并返回数据元数据
  3. 一个block块一个block块的读取数据。
    向datanode请求读取第一个block块。
  4. 传输数据.

写数据流程
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存储原理

回答很明白

smbios字节 sg字节_面经_02


负载因子:75%


链表长度大于7自动升级未红黑树

8.你还有什么需要问的?

我:面试官,我有哪些薄弱的环节?我回答的不太好,给我点建议吧!
小哥:加强基础!!!!