字节跳动一面(凉)
Posted johnsoncc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节跳动一面(凉)相关的知识,希望对你有一定的参考价值。
视频面试,上来就是一道算法题,LeetCode上的原题,440题(qaq,后悔当初没写到)
public int findKthNumber(int n, int k) { int cur=1; --k; while(k>0) { long step=0,first=cur,last=cur+1; while (first<=n) { step+=Math.min(n+1,last)-first; first*=10; last*=10; } if(step<=k) { ++cur; k-=step; }else { cur*=10; k--; } } return cur; }
然后是java的一些问答题
Map的实现方式有哪些,分别是怎么实现的?
常见的实现主要有HashMap(最常见的,内部无序的)、TreeMap(排过序的)及WeakMap(这个用于内存自动释放的);
关于HashMap,简单说是一个线性的数组结构,其中每个元素存储的是链表头结点,具体示意图如下(图直接在网上找的,比较形象):
HashMap里实现了一个静态的内部类Entry,重要的属性有key,value,next,hash。map中的数据就存储在Entry[]中,每次我们put数据时,通过该key的hashcode,得到该key在Entry[]中的索引,然后以e.next遍历,如果存在对应value,返回value,不存在就将其添加到Entry[]。
1.put(key,value)时,如果Entry[]的size超过threshold,则进行扩容,即table.length*2。
2.get(key) 时先定位到该数组元素,再遍历该元素处的链表。
如果我们再次放入同样的key会怎样呢?逻辑上,它应该替换老的value。事实上,它确实是这么做的。在迭代的过程中,会调用equals()方法来检查key的相等性(key.equals(k)),如果这个方法返回true,它就会用当前Entry的value来替换之前的value。
转载自:https://blog.csdn.net/jiangzhongwei_/article/details/51992621
更详细的可以参考:https://www.cnblogs.com/chengxiao/p/6059914.html
关于TreeMap:
(01) TreeMap实现继承于AbstractMap,并且实现了NavigableMap接口。
(02) TreeMap的本质是R-B Tree(红黑树),它包含几个重要的成员变量: root, size, comparator。
root 是红黑数的根节点。它是Entry类型,Entry是红黑数的节点,它包含了红黑数的6个基本组成成分:key(键)、value(值)、left(左孩子)、right(右孩子)、parent(父节点)、color(颜色)。Entry节点根据key进行排序,Entry节点包含的内容为value。
红黑数排序时,根据Entry中的key进行排序;Entry中的key比较大小是根据比较器comparator来进行判断的。
size是红黑数中节点的个数。
实现原理参考:https://www.cnblogs.com/skywang12345/p/3310928.html#a2
java回收机制是什么样的,如何判断一个对象是否应该被回收?
参见:https://www.cnblogs.com/andy-zcx/p/5522836.html
以上是关于字节跳动一面(凉)的主要内容,如果未能解决你的问题,请参考以下文章