Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

算法训练营第二周总结

  • 1.Java HashMap总结
  • 2.自己总结、收集题目解法方式的改进
  • 3.一些面试的想法

Java HashMap总结

1.map就是用于存储键值对(<key,value>)的集合类
2.HashMap基于链表和数组实现,java8中当哈希碰撞且链表元素大于8时,使用红黑树替代链表提升性能。
3.HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry键值对对象。
4.当两个对象的hashcode相同,即哈希碰撞时,hashmap会通过遍历链表(平衡树)的方式,即调用keys.equals()方法,寻找到正确的entry。
5.使用不可变的、声明作final的对象,并且采用合适的equals()和hashCode()方法的话,将会减少碰撞的发生,提高效率。不可变性使得能够缓存不同键的hashcode,这将提高整个获取对象的速度,使用String,Interger这样的wrapper类作为键是非常好的选择。
6.如果HashMap的大小超过了负载因子(load factor)定义的容量,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。
7.重新调整HashMap大小,多线程的情况下,可能产生条件竞争(race condition)。
当重新调整HashMap大小的时候,确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了,所以多线程情况下不推荐使用hashmap,而要使用hashtable或者性能更好的concurrenthashmap。
8.我们可以使用自定义的对象作为键,只要它遵守了equals()和hashCode()方法的定义规则(equals相同时hashcode一定相同,hashcode相同时equals不一定相同),并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。

自己总结、收集题目解法方式的改进

  • 在尝试过画脑图后,以失败告终,自己画得并不是很好,画完之后觉得反而更乱了,而且画脑图确实花的时间会更多,可能这方面自己的技能也有待提升。
  • 在看到课程里超哥提到的养成收集优秀题解的方式,其实自己做题也是大部分模仿的优秀题解来的,所以模仿https://shimo.im/docs/R6g9WJV89QkHrDhr/read 这位同学的方式,自己用石墨文档记录下自己的解题用的几个最优答案,还可以方便自己在通勤时间反复阅读浏览记忆,记录所花的时间也并不会特别多,我自己觉得这种方式很有效且迅速。现在自己就是创建了一个石墨文档的文件夹,将问题分门别类,每个文档写一个问题自己使用的解法总结,比如: https://shimo.im/docs/DrCkYjWjcP8dpyC8/ 《【hard】239. 滑动窗口最大值》。
  • 自己的作业也会用这种方式提交,而不是只提交一种解法。

一些面试的想法

  • 在leetcode剑指 Offer 40. 最小的k个数 题解中看到的大神的面经,觉得写得很不错,自己也总结了一下面试解题的过程自己该如何做。 和超哥说的一样,面试答题的时候切忌埋头解题,更要时刻与面试官沟通,最好是一边coding,一边沟通描述自己这样写的想法。不用太紧张,就像是和同事在讨论工作问题就行了。也不用刻意演,如果是有思路的题目,可以直接描述出题目自己所知道的几种写法,再写出最优解给面试官,或者按面试官的要求用什么解题思路去写,时刻沟通,如果是实在没有思路的题目,就尝试从暴力解法开始。 如果实在是没做过的题目(这种情况我觉得应该也会遇到,虽然超哥说了课程里给的题目都是高频考题,但是指不定面试官会换点儿花样来),暴力解法都想不到可以如何解,那也不硬撑,及时询问面试官,相信正常的面试官都会给点思路提示,只要最后能解出来便成,面试官更看重的是这个过程你的思路,你的解题逻辑和代码功力,如果实在解不出,也证明自己哪方面的知识和技能能没训练到位,回头再加强便可以了。面试过程最重要的是心态,要get到如果冷静而不慌乱地向面试官表达自己的思路,这个技能也是可以刻意训练的,多被虐几次,多做总结和反馈就可了。 来报名超哥的算法课其实也是自己用死磕法准备面试,明明遇过的题目,面试的时候却不知从何下手(平时解题次数不足),被虐了一轮回来,思考后觉得自己的方法肯定有问题,根据超哥教的方法总结、多刻意训练,相信明年初自己的下一轮面试可以表现的更好些。

大神的题解原文:

看到这个题就想到了我昨天面微软,3题ak还是挂,这个题很简单,排序、堆、quickselect,都可以做,面试的时候微软问了一道第k大,和这个题没啥区别的,我直接喷快选了,,毕竟O(n),然后一面就挂了。。。因为做题时候没好好沟通,面试经验太欠缺了!现在正是春招、找实习的时候,大家面试千万不要一上来就。。。我还是~~~总结下吧(也不能说演

先问清题目,各方面各种问,题目是什么意思,希望你干什么,你的api以后要拿到怎么用,给谁用?
确认方法的输入输出,希望收到什么样的参数?如果不是这种参数怎么处理,输出什么样的结果?结果的范围是?
和面试官确认边界条件,上限是什么?下限是什么?corner case要充分讨论
写代码时最好不断交流,嘴巴里要说,别就只顾着写
最后要给面试官算法复杂度,注意,这里一定要说清楚是最好、平均、最坏,用词要严谨,这些都是细节
一场面试学到很多东西,记录一下,做题其实是次要的,沟通真的非常重要,读人月神话就意识到了所谓沟通的重要性,也仅仅是读过,但没有实践过,就写这么多吧,祝小伙伴们春招顺利!

【更新】:@Wonz5130给我推荐了一位浙大大佬面试总结,我觉得写的非常好,也分享给大家:conanhujinming's github

作者:jerry_nju
链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/wei-ruan-mian-shi-jiao-xun-x-by-jerry_nju/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


最后是原文里提到的浙大大神的面经,膜拜,学习:
https://github.com/conanhujinming/tips_for_interview/blob/master/README-zh_CN.md#%e5%86%99%e5%9c%a820%e5%b9%b4%e5%88%9d%e7%9a%84%e6%a0%a1%e6%8b%9b%e9%9d%a2%e8%af%95%e5%bf%83%e5%be%97%e4%b8%8e%e8%87%aa%e5%ad%a6cs%e7%bb%8f%e9%aa%8c%e5%8f%8a%e6%89%be%e5%b7%a5%e4%bd%9c%e5%88%86%e4%ba%ab