为了保证制作简历的安全性和流畅性,建议您使用Chrome浏览器进行访问
# 先马后看
别犹豫了,马就完事了。在这里每个人都是分享者,你可以分享技能/干货/安装包/电影/图书等等宇宙内的所有资源。
···
1627人正在讨论
#
招舟
昆士兰大学·2022届

网易员工入职必学知识,适合互联网excel小白的系列课程!

更多秋招干货,上网易游戏学院app查看! https://game.academy.163.com/ssi/app/?referrer=niuke 通用技能研习社,源自网易游戏 网易独家管理秘籍,员工入职必学成长知识 首次对外开放,助你走上人生巅峰! 对互联网人来说,常用到excel的有8种场景,高频使用的有12种技能! 本次学院推出的《excel实用小技巧》课程,适合互联网领域工作的excel小白 抽空练习,短期就能用得溜溜der~ 妈妈再也不用担心我加班做表哥/表姐了!! 点击学习吧~~ 👇👇 https://game.academy.163.com/course/topicDetail?topic=34 目录: 第一章:数据整理——解决数据"脏乱差" 1.1 快速填充:摆脱重复工作 1.2 分列123:解决后台数据“脏乱差” 1.3 数据有效性:有效治疗表格疯 1.4 条件格式:BUG表横看竖看都牛X 第二章:函数与公式——轻松解决80%使用问题 2.1 绝对引用和if函数:轻松迈入函数世界 2.2 VLOOKUP:玩转函数界的一哥 2.3 求和:不用【SUM函数】也能快速求和 2.4 嵌套公式:步步拆解,项目管理也能666 第三章:数据透视表——再复杂的数据统计,也能分分钟完成 3.1 数据透视表:数据分析化繁为简 3.2 四种字段:完成各个维度不同报表 本门课程讲解的所有内容都是基于WIN系统2016版ExceI,建议大家安装软件后学习,提高实操能力。WPS和MAC版的ExceI,由于软件自身部分功能缺失,一些快捷键和功能可能无法实现。 看完视频后,请记抽空练习哦! 网易游戏内推及内部职业干货交流群,入群即可享受超多福利!! 还可以添加“网易游戏学院菌”微信号(NetEase_study)及时获取更多知识干货哦!
分享
1
先马后看
赵灵均
福州大学·2022届

广联达提前批第二批笔试名额预计今天下午发放,请注意查收

广联达提前批第二批(最后一批)笔试预计今天下午发放,请各位小伙伴注意查收自己的留下的联系方式 =========================================== 笔试题型 技术:客观题+在线编程; 产品笔试题型:问答; 数分:客观+编程; 测试(建筑专业):建筑专业基础+选答编程; 用户体验:设计思维; 职能:人力行政能力测评(行测); 财经:公司财务基础; =========================================== 总流程: 技术类:2轮;职能类:2-3轮。 预祝各位笔试面试顺利哈!!
分享
8
先马后看
零负荷的放任
香港科技大学·2022届

20届非科班本科女校招经验分享,收百度美团等公司offer

20届非科班本科女生校招经验分享,最后一次发帖。 本人因为秋招收到的offer不理想(58同城,银行和国企),所以寒假再复习最后收到了百度和美团等公司offer。因为经历时间比较长,感触颇深😶 😊关于互联网😊 个人感觉面试难的就是阿里和字节跳动,字节跳动面试官偏重算法思维,阿里偏重对技术掌握的深度(一直深挖)。剩下互联网难度都可以接受,计算机网+算法(coding)+编程基础+操作系统+挖简历项目,大部分2轮技术+1轮hr/经理面,技术面1个小时左右 😁关于银行😁 笔试:比较烦,因为考的特别杂,题量也很大,考编程很基础 面试:1-2轮,技术问的很简单,看着简历问问项目,有的银行会第1轮安排无领导小组讨论 感受:银行比互联网看重学历和综合能力还有稳定性,技术面比互联网简单很多。 😉关于国企😉 我主试了移动以及一汽等公司,中移信息技术1轮技术,1轮高管面。剩下地方省移动和一汽是1轮无领导小组讨论,2轮高管面。 国企和银行的面试感觉差不多,就是按着简历问问项目,侧重综合能力多些 😍个人感受😍 国企银行更适合投回家附近,因为比较稳定。要是去一线建议还是去互联网,好跳槽。千万不要方,只要认真复习都来得及,因为错过了提前批还有正式批,秋招补招,春招,春招补招。好好复习才是硬道理。女生投研发岗,互联网比国企银行有性别歧视😕测试类没有。 最后~祝大家都签到满意的工作~
分享
11
先马后看
蝶き梦
天津财经大学·2022届

美团内推,内推简历优先筛选,还可帮查进度!!!

参与内推可以简历优先筛选,最快进度的知道面试结果~ 内推链接(需要手机微信中打开):https://campus.meituan.com/bole/wechat?staffSsoId=2920693 上一条内推二维码被吞了,所以发的链接~难过T_T 参与内推后可以回复下贴子,需要查进度、询问跟美团点评秋招相关问题的都可以回复帖子或私聊我~ 每天都会回复大家的呀~~ 希望大家在秋招中都能够如愿以偿呀~
分享
7
先马后看
zhige
扬州大学·2022届

frm20年一级notes全

来自: 啦啦啦 2020-08-14 09:15:35 复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1L3mnzOcpqWd9eoenwAnzeA 提取码:mx2h 来自 豆瓣App
分享
22
先马后看
莉莉丝
莉莉丝

三年经验网易、滴滴、点我Java岗面试经验汇总

Java基础 1.HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。 2.HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小。 3.HashMap,HashTable,ConcurrentHashMap的区别。 4.极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。 5.HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么。 6.java中四种修饰符的限制范围。 7.Object类中的方法。 8.接口和抽象类的区别,注意JDK8的接口可以有实现。 9.动态代理的两种方式,以及区别。 10.Java序列化的方式。 11.传值和传引用的区别,Java是怎么样的,有没有传值引用。 12.一个ArrayList在循环过程中删除,会不会出问题,为什么。 13.@transactional注解在什么情况下会失效,为什么。 数据结构和算法 1.B+树 2.快速排序,堆排序,插入排序(其实八大排序算法都应该了解 3.一致性Hash算法,一致性Hash算法的应用 JVM 1.JVM的内存结构。 2.JVM方法栈的工作过程,方法栈和本地方法栈有什么区别。 3.JVM的栈中引用如何和堆中的对象产生关联。 4.可以了解一下逃逸分析技术。 5.GC的常见算法,CMS以及G1的垃圾回收过程,CMS的各个阶段哪两个是Stop the world的,CMS会不会产生碎片,G1的优势。 6.标记清除和标记整理算法的理解以及优缺点。 7.eden survivor区的比例,为什么是这个比例,eden survivor的工作过程。 8.JVM如何判断一个对象是否该被GC,可以视为root的都有哪几种类型。 9.强软弱虚引用的区别以及GC对他们执行怎样的操作。 10.Java是否可以GC直接内存。 11.Java类加载的过程。 12.双亲委派模型的过程以及优势。 13.常用的JVM调优参数。 14.dump文件的分析。 15.Java有没有主动触发GC的方式(没有)。 多线程 1.Java实现多线程有哪几种方式。 2.Callable和Future的了解。 3.线程池的参数有哪些,在线程池创建一个线程的过程。 4.volitile关键字的作用,原理。 5.synchronized关键字的用法,优缺点。 6.Lock接口有哪些实现类,使用场景是什么。 7.可重入锁的用处及实现原理,写时复制的过程,读写锁,分段锁(ConcurrentHashMap中的segment) 8.悲观锁,乐观锁,优缺点,CAS有什么缺陷,该如何解决。 9.ABC三个线程如何保证顺序执行。 10.线程的状态都有哪些。 11.sleep和wait的区别。 12.notify和notifyall的区别。 13.ThreadLocal的了解,实现原理。 数据库相关 1.常见的数据库优化手段 2.索引的优缺点,什么字段上建立索引 3.数据库连接池。 4.durid的常用配置。 计算机网络 1.TCP,UDP区别。 2.三次握手,四次挥手,为什么要四次挥手。 3.长连接和短连接。 4.连接池适合长连接还是短连接。 设计模式 1.观察者模式 2.代理模式 3.单例模式,有五种写法,可以参考文章单例模式的五种实现方式 4.可以考Spring中使用了哪些设计模式 分布式相关 1.分布式事务的控制。 2.分布式锁如何设计。 3.分布式session如何设计。 4.dubbo的组件有哪些,各有什么作用。 5.zookeeper的负载均衡算法有哪些。 6.dubbo是如何利用接口就可以通信的。 缓存相关 1.redis和memcached的区别。 2.redis支持哪些数据结构。 3.redis是单线程的么,所有的工作都是单线程么。 4.redis如何存储一个String的。 5.redis的部署方式,主从,集群。 6.redis的哨兵模式,一个key值如何在redis集群中找到存储在哪里。 7.redis持久化策略。 框架相关 1.SpringMVC的Controller是如何将参数和前端传来的数据一一对应的。 2.Mybatis如何找到指定的Mapper的,如何完成查询的。 3.Quartz是如何完成定时任务的。 4.自定义注解的实现。 5.Spring使用了哪些设计模式。 6.Spring的IOC有什么优势。 7.Spring如何维护它拥有的bean。 一些较新的东西 1.JDK8的新特性,流的概念及优势,为什么有这种优势。 2.区块链了解 3.如何设计双11交易总额面板,要做到高并发高可用。
分享
2
先马后看
二痣
广东金融学院·2022届

初级前端面试需要带什么作品

1.每一个企业都想招有两三年经验的人,可以直接出活;或者招985,211的应届生,企业相信他们学习能力强,也能快速的跟上;然而像我这样,野鸡大学非科班毕业,零经验,在竞争中那必然处于劣势,所以自己必须要满足两点:一有拿得出手的作品,二有对前端的热情。要知道面试你的人一般都是前端负责人,如果你的态度端正,对前端非常喜欢,对薪资要求符合自身水平的话,他会说服老板为你的潜力买单的。 2.选择好的团队。如果你去的公司前端团队只可能就你一个人或两三个的话,那就不要去了。环境很重要,抱团交流竞争互助成长才更快。尽量往大神堆里面去,要有宁愿在鹤群里当鸡,也不要在鸡群里面当鹤的思想(诶怎么感觉怪怪的)。 3.团队交流很重要,但自学必须是前端(或者整个IT)的必备技能,特别前端这个行业更新快,需要更强的自学能力,但也不要被什么angular,react,vue这些看似高大上的mvvm框架,或者gulp webpack require AMD CMD之类的 模块化,自动化,工程化弄懵逼了,稍微了解下他们的大体思想就可以了,毕竟自己只是一个初级的前端,框架都是看公司的选型,公司用什么,进去之后自然会学习的,至于你学的快不快,全靠你的基础牢不牢了。 4.只要你喜欢,认真对待,前端找个初级工作真的不难,要对自己有信心! ————————————————————————————— 一个优秀的offer再向你招手 https://url.cn/5PEkXQa 快来加入我们!!!
分享
5
先马后看
TAOTAO
伯明翰大学·2022届

暑期实习offer求比较-证券事务代表/中部券商行研/券商资管战略分析~感谢!

本人目前是头部985金融硕,本科普本,2021届毕业,现在拿到的暑期offer有: ①某头牌娱乐公司证券事务代表助理,面试时说这个职位好久没有开放了,是一次难得的机会,之后实习转正几率较大。 优点:娱乐方面跟本人兴趣比较相符,跟学校在同一个城市,交通较方便; 顾虑:未来职业上升路径就是证券事务代表-董秘,路子不广靠机遇,如果后期实习偏差较大,对之后的秋招貌似帮助不大。 ②某券商资管战略分析部 优点:资管的战略分析对未来发展路径以及之后的工作都是一份好的铺垫,金融壁垒更高; 顾虑:兴趣不大(理智告诉我这是一个金融人必须学习的东西),进入这里实习个人压力会很大,上海的高成本/资管业知识的不充分等。 ③某中部券商研究所传媒行业研究(在该行业表现突出) 优点:目前已实习一个月,和带教的小姐姐比较谈得来,然后说会有完善的培养培训机制(但小姐姐说暑期也跟她的话就感觉很悬了) 顾虑:上海的高成本-不包住,基本无实习工资;从实习看这个小姐姐日常工作很忙碌,感觉一周七天不休的样子,有点可怕;目前的工作几乎没有金融壁垒,且兴趣一般。 这几天很纠结,对未来职业规划也思考了很多,发上来希望大家能给我点建议,谢谢!
分享
评论
先马后看
理池景观
四川大学·2022届

实习三两事

好啦,上一次和大家讲啦我这一阶段对接校招同学作为hr如何看待简历的问题,今天要和大家讲讲这段时间从候选人简历上总结的好特征~今天先说说实习的同学吧! 校招同学肯定是和实习、社招有很大的区别,甄别一份好的简历也很简单 1、大厂经历或者实习经历,实习的同学简历中参加实习的少之又少,而参加过大厂实习的那就是在实习同学中比较有竞争力的,因为你的面试经历、团队合作经历、大厂对你的培养成本等等都会降低公司的成本,所以这类同学往往是我们hr做推进比较靠谱的。 2、实验室项目,这里面也是有两个区分点去看的,一个是本科生,本科生实习往往是大三和大四居多,大二的同学还是比较少的(优秀的大二同学入职的也不在少数),但是追其原因一是大二好多基础还并不是很牢固,竞争力比较低二是大二的同学有实习这种提前的想法的比较少。那就回来说说大三大四,总体来看本科的同学是很活跃的,因为国内本科很少有实验室老师带着做项目的,所以国内一些技术人才都会参加一些比赛,这种获奖经历也是提升自身竞争力的好方法。再有就是硕士生,硕士的同学实验室项目就是必须有的,而且区别于本科生实验室项目往往是个大头比例,甚至很多产出论文等等,这些也是我们hr关注的重点。 3、最后一些就是hr会关注的硬性指标啦,那就是实习时长,尤其是技术类的,涉及到培养成本,当然是需要同学可以实习的时间越长越好,全面深刻的了解项目,参与进来才是最重要的。 好啦,今天关于实习简历的分享就先到这里,有问题的同学留言问我哈~
分享
1
先马后看
RoseofVersailles
中南财经政法大学·2022届

写给初中级前端的算法进阶指南,我是如何零基础两个月刷200题

最近国内大厂面试中,出现    LeetCode 真题考察的频率越来越高了。我也观察到有越来越多的前端同学开始关注算法这个话题。 但是算法是一个门槛很高的东西,在一个算法新手的眼里,它的智商门槛要求很高。事实上是这个样子的吗?如果你怀疑自己的 智商不够 去学习算法,那么你一定要先看完这篇文章: 《天生不聪明》 ,也正是这篇文章激励了我开始了算法之路。 这篇文章,我会先总结几个 必学的题目分类 ,给出 这个分类下必做例题 的详细题解,并且在文章的末尾给出 每个分类下必刷的题目 的获取方式。 这几个点缺一不可,请耐心看完。 心路 我从 5 月份准备离职的时候开始学习算法,在此之前对于算法我是 零基础 ,在最开始我对于算法的感受也和大家一样,觉得自己智商可能不够,望而却步。但是看了一些大佬对于算法和智商之间的关系,我发现算法好像也是一个通过练习可以慢慢成长的学科,而不是只有智商达到了某个点才能有入场券,所以我开始了我的算法之路。通过 视频课程 + 分类刷题 + 总结题解 + 回头复习 的方式,我在两个月的时间里把力扣的解题数量刷到了 200 题。对于一个算法新人来说,这应该算是一个还可以的成绩,这篇文章,我把我总结的一些经典题解分享给大家。 学习方式 分类刷题:很多第一次接触力扣的同学对于刷题的方法不太了解,有的人跟着题号刷,有的人跟着每日一题刷,但是这种漫无目的的刷题方式一般都会在中途某一天放弃,或者刷了很久但是却发现没什么沉淀。这里直接点名所有大佬都推荐的刷题方法:,把自己的学习阶段分散成几个时间段,比如第一周专门解 链表 相关题型,第二周专门解 二叉树 相关题型。这样你的知识会形成一个体系,通过一段时间的刻意练习把这个题型相关的知识点强化到你的脑海中,不容易遗忘。 适当放弃:很多同学遇到一个难题,非得埋头钻研,干他 2 个小时。最后挫败感十足,久而久之可能就放弃了算法之路。要知道算法是个沉淀了几十年的领域,题解里的某个算法可能是某些教授研究很多年的心血,你想靠自己一个新手去想出来同等优秀的解法,岂不是想太多了。所以要学会适当放弃,一般来说,比较有目的性(面试)刷题的同学,他面对一道新的题目毫无头绪的话,会在 10 分钟之内直接放弃去看题解,然后记录下来, 反复复习 ,直到这个解法成为自己的知识为止。这是效率最高的学习办法。 接受自己是新手:没错,说的难听一点,接受自己不是天才这个现实。你在刷题的过程中会遇到很多困扰你的时候,比如相同的题型已经看过例题, 稍微变了条件就解不出来 。或者对于一个 easy 难度的题毫无头绪 。或者甚至 看不懂别人的题解 (没错我经常)相信我,这很正常,不能说明你不适合学习算法,只能说明算法确实是一个博大精深的领域,把自己在其他领域的沉淀抛开来,接受自己是新手这个事实,多看题解,多请教别人。 分类大纲 算法的复杂度分析。 排序算法,以及他们的区别和优化。 数组中的双指针、滑动窗口思想。 利用 Map 和 Set 处理查找表问题。 链表的各种问题。 利用递归和迭代法解决二叉树问题。 栈、队列、DFS、BFS。 回溯法、贪心算法、动态规划。 题解 接下来我会放出几个分类的经典题型,以及我对应的讲解,当做开胃菜,并且在文章的末尾我会给出获取每个分类 推荐你去刷 的题目的合集,记得看到底哦。 查找表问题 两个数组的交集 II-350 给定两个数组,编写一个函数来计算它们的交集。 复制代码 1 2 3 4 5 6 7 8 9 示例 1:   输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2:   输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9] 复制代码 来源:力扣(LeetCode) 链接: leetcode-cn.com/problems/in… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 为两个数组分别建立 map,用来存储 num -> count 的键值对,统计每个数字出现的数量。 然后对其中一个 map 进行遍历,查看这个数字在两个数组中分别出现的数量,取出现的最小的那个数量(比如数组 1 中出现了 1 次,数组 2 中出现了 2 次,那么交集应该取 1 次),push 到结果数组中即可。 复制代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /**  * @param {number[]} nums1  * @param {number[]} nums2  * <a href="/profile/547241" data-card-uid="547241" class="js-nc-card" target="_blank" from-niu="default">@return {number[]}  */ let intersect = function (nums1, nums2) { let map1 = makeCountMap(nums1) let map2 = makeCountMap(nums2) let res = [] for (let num of map1.keys()) {     const count1 = map1.get(num)     const count2 = map2.get(num) if (count2) {       const pushCount = Math.min(count1, count2) for (let i = 0; i < pushCount; i++) {         res.push(num)       }     }   } return res }   function makeCountMap(nums) { let map = new Map() for (let i = 0; i < nums.length; i++) { let num = nums[i] let count = map.get(num) if (count) { map.set(num, count + 1)     } else { map.set(num, 1)     }   } return map } 复制代码</a> 双指针问题 最接近的三数之和-16 给定一个包括  n 个整数的数组  nums  和 一个目标值  target。找出  nums  中的三个整数,使得它们的和与  target  最接近。返回这三个数的和。假定每组输入只存在唯一答案。 复制代码 1 2 3 4 5 6 示例:   输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。 复制代码 提示: 3 <= nums.length <= 10^3 -10^3 <= nums[i] <= 10^3 -10^4 <= target <= 10^4 来源:力扣(LeetCode) 链接: leetcode-cn.com/problems/3s… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 先按照升序排序,然后分别从左往右依次选择一个基础点    i (    0 <= i <= nums.length - 3),在基础点的右侧用双指针去不断的找最小的差值。 假设基础点是    i ,初始化的时候,双指针分别是: left :    i + 1 ,基础点右边一位。 right :    nums.length - 1 数组最后一位。 然后求此时的和,如果和大于    target ,那么可以把右指针左移一位,去试试更小一点的值,反之则把左指针右移。 在这个过程中,不断更新全局的最小差值    min ,和此时记录下来的和    res 。 最后返回    res 即可。 复制代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /**  * @param {number[]} nums  * @param {number} target  * <a href="/profile/547241" data-card-uid="547241" class="js-nc-card" target="_blank" from-niu="default">@return {number}  */ let threeSumClosest = function (nums, target) { let n = nums.length if (n === 3) { return getSum(nums)   } // 先升序排序 此为解题的前置条件 nums.sort((a, b) => a - b) let min = Infinity // 和 target 的最小差 let res // 从左往右依次尝试定一个基础指针 右边至少再保留两位 否则无法凑成3个 for (let i = 0; i <= nums.length - 3; i++) { let basic = nums[i] let left = i + 1 // 左指针先从 i 右侧的第一位开始尝试 let right = n - 1 // 右指针先从数组最后一项开始尝试 while (left < right) { let sum = basic + nums[left] + nums[right] // 三数求和 // 更新最小差 let diff = Math.abs(sum - target) if (diff < min) { min = diff         res = sum       } if (sum < target) { // 求出的和如果小于目标值的话 可以尝试把左指针右移 扩大值 left++       } else if (sum > target) { // 反之则右指针左移 right--       } else { // 相等的话 差就为0 一定是答案 return sum       }     }   } return res }   function getSum(nums) { return nums.reduce((total, cur) => total + cur, 0) } 复制代码</a> 滑动窗口问题 无重复字符的最长子串-3 给定一个字符串,请你找出其中不含有重复字符的   最长子串   的长度。 示例  1: 复制代码 1 2 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 复制代码 示例 2: 复制代码 1 2 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 复制代码 示例 3: 复制代码 1 2 3 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。      请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 复制代码 来源:力扣(LeetCode) 链接: leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 这题是比较典型的滑动窗口问题,定义一个左边界    left 和一个右边界    right ,形成一个窗口,并且在这个窗口中保证不出现重复的字符串。 这需要用到一个新的变量    freqMap ,用来记录窗口中的字母出现的频率数。在此基础上,先尝试取窗口的右边界再右边一个位置的值,也就是    str[right + 1] ,然后拿这个值去    freqMap 中查找: 这个值没有出现过,那就直接把    right ++ ,扩大窗口右边界。 如果这个值出现过,那么把    left ++ ,缩进左边界,并且记得把    str[left] 位置的值在    freqMap 中减掉。 循环条件是    left < str.length ,允许左边界一直滑动到字符串的右界。 复制代码 1 2 3 4 5 6 7 8 9 10 11 /**  * @param {string} s  * <a href="/profile/547241" data-card-uid="547241" class="js-nc-card" target="_blank" from-niu="default">@return {number}  */ let lengthOfLongestSubstring = function (str) { let n = str.length   // 滑动窗口为s[left...right] let left = 0 let right = -1 let freqMap = {} // 记录当前子串中下标对应的出现频率 let max = 0 // 找到的满足条件子串的最长长度 while (left < n) { let nextLetter = str[right + 1] if (!freqMap[nextLetter] && nextLetter !== undefined) {       freqMap[nextLetter] = 1 right++     } else {       freqMap[str[left]] = 0 left++     } max = Math.max(max, right - left + 1)   } return max } 复制代码</a> 链表问题 两两交换链表中的节点-24 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 复制代码 1 2 给定 1->2->3->4, 你应该返回 2->1->4->3. 复制代码 来源:力扣(LeetCode) 链接: leetcode-cn.com/problems/sw… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 这题本意比较简单,    1 -> 2 -> 3 -> 4 的情况下可以定义一个递归的辅助函数    helper ,这个辅助函数对于节点和它的下一个节点进行交换,比如    helper(1) 处理    1 -> 2 ,并且把交换变成2 -> 1 的尾节点    1 的    next 继续指向    helper(3) 也就是交换后的    4 -> 3 。 边界情况在于,如果顺利的作了两两交换,那么交换后我们的函数返回出去的是 交换后的头部节点 ,但是如果是奇数剩余项的情况下,没办法做交换,那就需要直接返回 原本的头部节点 。这个在    helper 函数和主函数中都有体现。 复制代码 1 2 3 4 5 6 7 8 9 let swapPairs = function (head) { if (!head) return null let helper = function (node) { let tempNext = node.next if (tempNext) { let tempNextNext = node.next.next node.next.next = node if (tempNextNext) {         node.next = helper(tempNextNext)       } else {         node.next = null       }     } return tempNext || node   } let res = helper(head) return res || head } 复制代码 深度优先遍历问题 二叉树的所有路径-257 给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明:  叶子节点是指没有子节点的节点。 示例: 复制代码 1 2 3 输入: 1 /   \ 2 3 \ 5 输出: ["1->2->5", "1->3"]   解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3 复制代码 来源:力扣(LeetCode) 链接: leetcode-cn.com/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 用当前节点的值去拼接左右子树递归调用当前函数获得的所有路径。 也就是根节点拼上以左子树为根节点得到的路径,加上根节点拼上以右子树为根节点得到的所有路径。 直到叶子节点,仅仅返回包含当前节点的值的数组。 复制代码 1 2 3 4 5 6 7 8 9 10 11 12 let binaryTreePaths = function (root) { let res = [] if (!root) { return res   } if (!root.left && !root.right) { return [`${root.val}`]   } let leftPaths = binaryTreePaths(root.left) let rightPaths = binaryTreePaths(root.right)     leftPaths.forEach((leftPath) => {     res.push(`${root.val}->${leftPath}`)   })   rightPaths.forEach((rightPath) => {     res.push(`${root.val}->${rightPath}`)   }) return res } 复制代码 广度优先遍历(BFS)问题 在每个树行中找最大值-515 leetcode-cn.com/problems/fi… 您需要在二叉树的每一行中找到最大的值。 输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9] 复制代码 思路 这是一道典型的 BFS 题目,BFS 的套路其实就是维护一个 queue 队列,在读取子节点的时候同时把发现的孙子节点 push 到队列中,但是 先不处理 ,等到这一轮队列中的子节点处理完成以后,下一轮再继续处理的就是 孙子节点 了,这就实现了层序遍历,也就是一层层的去处理。 但是这里有一个问题卡住我了一会,就是如何知道当前处理的节点是 哪个层级 的,在最开始的时候我尝试写了一下二叉树求某个 index 所在层级的公式,但是发现这种公式只能处理「平衡二叉树」。 后面看题解发现他们都没有专门维护层级,再仔细一看才明白层级的思路: 其实就是在每一轮 while 循环里,再开一个 for 循环,这个 for 循环的终点是「提前缓存好的 length 快照」,也就是进入这轮 while 循环时,queue 的长度。其实这个长度就恰好代表了「一个层级的长度」。 缓存后,for 循环里可以安全的把子节点 push 到数组里而不影响缓存的当前层级长度。 另外有一个小 tips,在 for 循环处理完成后,应该要把 queue 的长度截取掉上述的缓存长度。一开始我使用的是    queue.splice(0, len) ,结果速度只击败了 33%的人。后面换成 for 循环中去一个一个    shift 来截取,速度就击败了 77%的人。 复制代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /**  * @param {TreeNode} root  * <a href="/profile/547241" data-card-uid="547241" class="js-nc-card" target="_blank" from-niu="default">@return {number[]}  */ let largestValues = function (root) { if (!root) return [] let queue = [root] let maximums = [] while (queue.length) { let max = Number.MIN_SAFE_INTEGER // 这里需要先缓存length 这个length代表当前层级的所有节点 // 在循环开始后 会push新的节点 length就不稳定了 let len = queue.length for (let i = 0; i < len; i++) { let node = queue[i] max = Math.max(node.val, max) if (node.left) {         queue.push(node.left)       } if (node.right) {         queue.push(node.right)       }     } // 本「层级」处理完毕,截取掉。 for (let i = 0; i < len; i++) {       queue.shift()     } // 这个for循环结束后 代表当前层级的节点全部处理完毕 // 直接把计算出来的最大值push到数组里即可。 maximums.push(max)   } return maximums } 复制代码</a> 栈问题 有效的括号-20 给定一个只包括    '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 复制代码 1 输入: "()" 输出: true 复制代码 示例 2: 复制代码 1 输入: "()[]{}" 输出: true 复制代码 示例 3: 复制代码 1 输入: "(]" 输出: false 复制代码 示例 4: 复制代码 1 输入: "([)]" 输出: false 复制代码 示例 5: 复制代码 1 输入: "{[]}" 输出: true 复制代码 leetcode-cn.com/problems/va… 思路 提前记录好左括号类型    (, {, [ 和右括号类型    ), }, ] 的映射表,当遍历中遇到左括号的时候,就放入栈    stack 中(其实就是数组),当遇到右括号时,就把    stack 顶的元素    pop 出来,看一下是否是这个右括号所匹配的左括号(比如    ( 和    ) 是一对匹配的括号)。 当遍历结束后,栈中不应该剩下任何元素,返回成功,否则就是失败。 复制代码 1 2 3 4 5 6 7 8 9 10 11 12 13 /**  * @param {string} s  * <a href="/profile/547241" data-card-uid="547241" class="js-nc-card" target="_blank" from-niu="default">@return {boolean}  */ let isValid = function (s) { let sl = s.length if (sl % 2 !== 0) return false let leftToRight = { "{": "}", "[": "]", "(": ")",   } // 建立一个反向的 value -> key 映射表 let rightToLeft = createReversedMap(leftToRight) // 用来匹配左右括号的栈 let stack = [] for (let i = 0; i < s.length; i++) { let bracket = s[i] // 左括号 放进栈中 if (leftToRight[bracket]) {       stack.push(bracket)     } else { let needLeftBracket = rightToLeft[bracket] // 左右括号都不是 直接失败 if (!needLeftBracket) { return false } // 栈中取出最后一个括号 如果不是需要的那个左括号 就失败 let lastBracket = stack.pop() if (needLeftBracket !== lastBracket) { return false }     }   } if (stack.length) { return false } return true } function createReversedMap(map) { return Object.keys(map).reduce((prev, key) => { const value = map[key]     prev[value] = key return prev   }, {}) } 复制代码</a> 递归与回溯 直接看我写的这篇 前端「N 皇后」递归回溯经典问题图解 即可。 动态规划 打家劫舍 - 198 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 复制代码 1 2 3 4 5 6 7 8 9 10 11 12 13 示例 1:   输入: [1,2,3,1] 输出: 4 解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。   偷窃到的最高金额 = 1 + 3 = 4 。 示例 2:   输入: [2,7,9,3,1] 输出: 12 解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。   偷窃到的最高金额 = 2 + 9 + 1 = 12 。 复制代码 来源:力扣(LeetCode) 链接: leetcode-cn.com/problems/ho… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 动态规划的一个很重要的过程就是找到「状态」和「状态转移方程」,在这个问题里,设    i 是当前屋子的下标,状态就是 以 i 为起点偷窃的最大价值 在某一个房子面前,盗贼只有两种选择: 偷或者不偷 。 偷的话,价值就是「当前房子的价值」+「下两个房子开始***的最大价值」 不偷的话,价值就是「下一个房子开始***的最大价值」 在这两个值中,选择 最大值 记录在    dp[i] 中,就得到了 以    i 为起点所能偷窃的最大价值。。 动态规划的起手式,找 基础状态 ,在这题中,以 终点 为起点的最大价值一定是最好找的,因为终点不可能再继续往后偷窃了,所以设    n 为房子的总数量,    dp[n - 1] 就是    nums[n - 1] ,小偷只能选择偷窃这个房子,而不能跳过去选择下一个不存在的房子。 那么就找到了动态规划的状态转移方程: 复制代码 1 2 // 抢劫当前房子 robNow = nums[i] + dp[i + 2] // 「当前房子的价值」 + 「i + 2 下标房子为起点的最大价值」 // 不抢当前房子,抢下一个房子 robNext = dp[i + 1] //「i + 1 下标房子为起点的最大价值」 // 两者选择最大值 dp[i] = Math.max(robNow, robNext) 复制代码 ,并且 从后往前 求解。 复制代码 1 2 3 4 5 function (nums) { if (!nums.length) { return 0;   } let dp = []; for (let i = nums.length - 1; i >= 0; i--) { let robNow = nums[i] + (dp[i + 2] || 0) let robNext = dp[i + 1] || 0 dp[i] = Math.max(robNow, robNext)   } return dp[0]; }; 复制代码 最后返回 以 0 为起点开始打劫的最大价值 即可。 贪心算法问题 分发饼干-455 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值  gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 注意: 你可以假设胃口值为正。 一个小朋友最多只能拥有一块饼干。 复制代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 示例 1:   输入: [1,2,3], [1,1] 输出: 1   解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 所以你应该输出1。 示例 2:   输入: [1,2], [1,2,3] 输出: 2   解释: 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出2. 复制代码 来源:力扣(LeetCode) 链接: leetcode-cn.com/problems/as… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 把饼干和孩子的需求都排序好,然后从最小的饼干分配给需求最小的孩子开始,不断的尝试新的饼干和新的孩子,这样能保证每个分给孩子的饼干都恰到好处的不浪费,又满足需求。 利用双指针不断的更新    i 孩子的需求下标和    j 饼干的值,直到两者有其一达到了终点位置: j++ i++; j++; count++ 复制代码 1 2 3 4 5 6 7 8 9 10 11 /**  * @param {number[]} g  * @param {number[]} s  * <a href="/profile/547241" data-card-uid="547241" class="js-nc-card" target="_blank" from-niu="default">@return {number}  */ let findContentChildren = function (g, s) { g.sort((a, b) => a - b)   s.sort((a, b) => a - b) let i = 0 let j = 0 let count = 0 while (j < s.length && i < g.length) { let need = g[i] let cookie = s[j] if (cookie >= need) { count++       i++ j++     } else { j++     }   } return count } 复制代码</a> 必做题目 以上分类所提到的题目,只是当前分类下比较适合作为例题来讲解的题目而已,在整个    LeetCode 学习过程中只是冰山一角。 可以当个引子看看,也可以认真的把每一道题吸收,但是最终不可避免的是,你一定要 发散 的去做 这个分类下其他的经典题型 ,刻意练习,吸收内化,最后才能做到举一反三,所向披靡。 如果你信任我,你也可以 <stron> </stron>获取我总结的各个分类下 必做题目 的详细题解。 什么样的叫做必做题目呢? 不要有各种奇巧淫技,拒绝偏题,怪题。 做这个题的方式,最好可以吸收为模板,举一反三的去解决其他题目。 面试热门题目。 你可以跟着我的题解刷,也可以跟着我 推荐给你的课程 来刷,这是我目前所找到的效率最高的方式。 总结 关于算法在工程方面有用与否的争论,已经是一个经久不衰的话题了。这里不讨论这个,我个人的观念是 绝对有用 的,只要你不是一个甘于只做简单需求的人,你一定会在后续开发架构、遇到难题的过程中或多或少的从你的算法学习中受益。 再说的功利点,就算是为了面试,刷算法能够进入大厂也是你职业生涯的一个起飞点,大厂给你带来的的环境、严格的    Code Review 、完善的导师机制和协作流程也是你作为 工程师 所梦寐以求的。 希望这篇文章能让你不再继续害怕算法面试,跟着我一起攻下这座城堡吧,大家加油!
分享
3
先马后看
夏天的_人是_色
南京邮电大学·2022届

“项目制学习法”,有想一起试试看的嘛?

之前了解过一种”项目制学习法“,大概是这样的: 1.【定框架】 给要学习的大方向,定个框架(可以按照这本书的目录来),比如把需要学习关于产品的知识拆解成 场景营销 用户画像 竞品分析 ··· ···等等 2.【细分输入】 然后大家每周选个主题学习研究。比如这周我们每个人都自学一些关于用户画像的内容干货,分享到项目群里相互学习讨论。 要点:主题学习这些都不设固定时间的打卡,就像看到某篇文章写的很精彩想要和朋友分享那样就行,加上自己的评论见解,自由度宽松些更能激发随意分享交流的氛围 3.【归纳输出】 但每周的周末设置一个固定时间,由一位整理者将本周大家的输出简单总结,加上自己的见解进行分享,分享完大家二次讨论看有哪些优化的地方。 要点: 每周的整理者轮流换人,这样就能让更多人有输出 输入输出都存在的学习,才能更好得吸收。而且输出的内容分享如果够精彩,说不定也能成为求职作品呢。如果你觉得这个idea不错的话,给我点赞,一起学习、一起上岸呀! 点赞的人有好运,有好运好上岸,冲鸭
分享
2
先马后看
长亭Time
西交利物浦大学·2022届

有华为8.31东莞报道的同学吗

求联系
分享
1
先马后看
M4M
香港城市大学·2022届

day01

在今天学习了Date和集合 Date 日期 date.getTime() 时间戳 date.toLocaleString() 显示本机时间 System.currentTimeMillis() 显示现在至1900年的毫秒数 SimpleDateFormat 工具类 format 方法: 将日期对象转为日期字符串 parse 方法:将日期的字符串转为日期 示例: Date date = new Date(); String strDateFormat = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat); System.out.println(sdf.format(date)); --2020-07-09 20:24:46 Calendar 抽象类 Calendar.getInstance()          获取当前日期对象 Calendar.DAY_OF_MONTH   本月的第几天 Calendar.DAY_OF_WEEK       本周的星期几--从星期日开始 Calendar.HOUR_OF_DAY       24小时制 Calendar.WEEK_OF_MONTH 本周是该月的第几周 添加时间 Calendar.add(Calendar.DATE,30);  添加30天 Calendar.set ( 年 月 日)   设置时间 Random 随机数 Math.Random ()  产生0.0~1.0 之间的数 常用 Random random = new Random(); System.out.println(random.nextInt(5)) randoms.setSeed(5)   种子 集合: 可以存放多种数据类型数据的数据结构 特点: 1.集合的长度是可以改变的 2.对存放的数据类型没有限制 定义: 集合类 obj  = new 集合类(); 集合的分类 集合分为单值集合(Collection)和键值对集合(Map) Collection接口是所有接口的负借口 List集合:有序可重复 Set集合:无序不可集合 集合中的各种区别: 1.Collection 和 Collections的区别: Collection 是一个接口,是所有单值集合的父类接口 Collections 是一个帮助类,提供了很多对集合的操作的静态方法 2.List 接口和 Set 接口的区别: List接口和Set接口都是Collection的子接口 List集合中的元素都是有序可重复的,Set集合中的元素都是无序不可重复的 3.ArrayList   和 LinkedList 的区别:* ArrayList和LinkedList都是List接口的实现,其元素是有序可重复的 ArrayList 中的元素的存储是基于数组实现的,元素的查询,添加速度比较快,Vector也是这样的; LinkedList中的元素存储是基于链表实现的,元素的插入速度比较快,查询和添加比较慢 二者都是非同步,非线程安全的 4.ArrayList 和 Vector 的区别: ArrayList和Vector都是基于数组存储的 ArrayList是非线程安全的,但存储效率高一些 Vector是线程安全的,实现了线程同步 5.HashSet 和 TreeSet 的区别 两者都是Set接口的实现类,其元素是无序不可重复的 区别在于:HashSet是基于hash码散列存储,TreeSet树形存储 6.HashMap 和 Hashtable 的区别 两者都是MAp的接口的实现类,都表示键值对集合; 使用键值对(key-Value),值(Value)可以重复,但键(Key)不可以重复 HashMap中允许一个null键和多个null值,但是Hashtable中不允许null作为key和Value hashMap未实现同步,是非线程安全;而Hashtable实现了同步,是线程安全
分享
3
先马后看
森林系女孩
北京语言大学·2022届

华为台式电脑真机亮相,搭载国产操作系统

近两年,华为凭借着出众的产品设计能力,以及高效的多屏协同功能,在手机、笔记本市场都取得出彩的成绩。不过,华为在智能终端领域的野心远不止如此,之前华为PC业务总裁王银锋曾表示,华为不仅要在笔记本领域打响名声,未来还会推出台式机、一体机等设备。 而就在王银锋发表该言论的两个月后,华为台式机就被海外网友曝光了出来。近日,华为台式机更是已现身华为开发者官网,名称为“擎云”,产品未来将由富士康代工生产。值得一提的是,华为首批台式机并不是面向普通消费者,而是为政企单位、教育机构提供服务。 这也与华为台式机特点有关,结合海外科技博主爆料的消息,华为台式机均为全国产配置,搭载鲲鹏920 3211K处理器,并且CPU在主板上不可拆卸。由于鲲鹏处理器目前十分小众,因此Windows系统在该电脑上会出现无法安装的问题。 不过用户也不必担心,虽然Windows系统与该机无缘,但统信软件研发的UOS国产操作系统已经对该处理器完成适配,而且UOS系统还能为用户提供基础的功能支持,应付日常使用绰绰有余。值得一提的是,华为台式机也在努力建立生态。 此外笔者发现,华为擎云生态清单已现身官网,根据官方描述,擎云生态目前适配近500款软件和硬件。小到输入法、文档阅读,大到浏览器、扫描仪,华为台式机均完成了适配。因此对于绝大多数消费者而言,华为台式机完全能满足日常使用需求。 事实上,对于大多数国产厂商而言,设计一款PC系统并不是难事,最大的难题在于无法建立足够大、足够强的生态。而华为推出的擎云系列桌面终端生态适配计划,在未来便有望解决这难题。该计划的出现,也为华为PC设备涉足在民用市场保留了希望。 目前,华为台式机电脑已经亮相,相信不久后就会量产、交付。另外根据最新消息,华为还有一款搭载AMD芯片的产品正在准备量产
分享
评论
先马后看
porpose
首都师范大学·2022届

阿里 10 年,用最少的语言分享一些经验

1、 选择比努力更重要。 努力能让自己很好的适应工作,好的选择,可以比同龄人快几倍 2、 工作前三年及其重要 好的起点,好的机会,好的环境会让你快速成长,3 年后,一些人成为骨干,一些人仍然做着重复的工作。   脑力劳动者一定不要重复自己 3、 好的老板,就是人生贵人 愿意帮助你、关注成长、团队氛围、机会创造 4、 什么样的工作是好工作? 赛道、趋势:公司所处行业是否是上升赛道。     个体永远无法抗衡趋势 风口:当前或者未来一年,公司的业务会不会迎来风口。      风口让你一步登天 部门:你部门负责的事情,是不是公司的重点。         再好的公司,你的部门是边缘业务,你的机会也不大 老板:团队氛围、人员构成、老板风格。    这决定了你平时工作开不开心,有没有激情 做的事情:你如何后将负责什么样的事情,这个决定了你工作产出的结果和价值。 5、 校招如何面试? 如果有愿意直接电话指导你的师兄师姐,不用想,直接投 如果投了之后一周都没人联系你,果断拒绝 简历、刷题,要自己搞,不能靠别人 面试经验: 没事自己多练练,同学之间相互面试 发送简历联系 qiyou.lz@alibaba-inc.com 或牛客沟通 由于精力有限 阿里内推过的同学就不要咨询了 每天定时回复 了解更多 移步招聘贴 https://www.nowcoder.com/discuss/469875 我们是谁? 阿里巴巴钉钉教育 1、 钉钉目前 3 亿用户,国内用户数超过这个钉钉的,可以数的过来的(趋势) 2、 教育因为去年疫情,我们有了非常好的用户基础,未来可期,是公司级别的核心业务(风口) 3、 老板: 我是前端 TL,阿里工作 10 年,本科毕业,从 P4 晋升 P8 用了 7 年,感谢我老板的成就,所以我也愿意成就我的下属。大家共同成长 一点随想 回想起自己刚毕业那会,目标就是:‘’找个工作”,毕业季找工作的时候同学之间都会相互比较 offer ,看工资,人之常情。 但后来的经历告诉我,趋势、风口、老板等都是何其重要,一份让你快速成长的工作,决定了你未来的人生起点。 钉钉教育,此时此刻我觉得是一个好的机会,钉钉教育没有那么大名声,但却处于高速发展期,跟着团队一起向上快速发展,这就是一份值得选择的工作,我深信这一点。 来钉钉教育,这个选择不会错。
分享
6
先马后看