字节跳动一面(凉)

视频面试,上来就是一道算法题,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

猜你喜欢

转载自www.cnblogs.com/JohnsonCC/p/9663062.html