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 的原理 怎么读写数据的。
人家重点问我是怎么删除数据,这个我不会。
在这里插入图片描述

读数据流程

  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存储原理

回答很明白
在这里插入图片描述
负载因子:75%
链表长度大于7自动升级未红黑树

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

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

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值