Algorithm

Leetcode 3__ 无重复字符的最长子串长度

示例 3:

输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。

解法:双指针+哈希表
image.png

  1. class Solution {
  2. public int lengthOfLongestSubstring(String s) {
  3. int a_pointer =0; /*字符串头指针a*/
  4. int b_pointer =0; /*字符串尾指针b*/
  5. int max =0; /*当前最长字串长度*/
  6. HashSet<Character> hash_set= new HashSet(); /*新开一个哈希表*/
  7. while (b_pointer<s.length()){ /*当尾指针b还没走完*/
  8. if(!hash_set.contains(s.charAt(b_pointer))){ /*如果哈希表没有b指针下的字符*/
  9. hash_set.add(s.charAt(b_pointer)); /*就把这个字符加到哈希表*/
  10. b_pointer++; /*指针b往后挪1位*/
  11. max=Math.max(hash_set.size(),max); /*更新当前哈希表的最大长度*/
  12. }else{ /*如果b指针下的字符和哈希表重复了*/
  13. hash_set.remove(s.charAt(a_pointer)); /*哈希表移除a指针下的字符,相当于把之前错误的记录删除,替换新的字串*/
  14. a_pointer++; /*指针a往后挪1位*/
  15. }
  16. }
  17. return max;
  18. }
  19. }

Review

image.pngimage.png
下学期上课要用的算法书,封面里迷路的山羊和狗子超可爱了,这本书和国内传统的数据结构编排非常不一样。国内一般是按线性表、栈、队列、串、数组和广义表、树、图、动态存储管理、查找、内排、外排、文件来归集目录的。国内方式的优点是,可以对同一问题下不同算法的效率进行即时比较,缺点是以牺牲算法设计技术为代价来强调问题类型。这本书是按算法设计思路来归类的,先讲时间复杂度、暴力解法、递归,然后是图遍历、常数减治法(decrease & conquer by a constant)、条件减治法(decrease & conquer by a factor)、分治法排序(sorting with divide & conquer)、更多分治算法、优先队列和堆排序、转治法( transform & conquer)和平衡树、输入强化(input enhancement)和哈希表、动态规划和Warshal & Floyd 算法、贪心技术和Prim & Dijkstra 算法、用于数据压缩的Huffman编码。
image.png
这一页讲的是求两个数最大公约数的算法设计思路。首先有一个神奇的数学定理gcd(m,n)=gcd(n, m nod n), 假定m,n都是非负整数,且不同时为0。然后就可以基于这个公式让其无限循环,直到m nod n=0为止。

gcd=greatest common divisor最大公约数
**
算法有点像一种形而上的哲学思想,如果你在思想上胜出了,写出来的解决方案一定是远超常规方法和暴力解法的。

while(n≠0){
  r= m nod n;      /把m、n替换成n、m mod n/
  m=n;
  n=r;
}
return m;

Tip

html创建Canvas画布

做两个网页功能键。点击按钮,空白画布立即产生效果。
以下是初始状态。
image.png
左侧画布加一个橡皮擦效果。
Week 4 - 图6

<canvas id="d1"></canvas>  <canvas id="d2"></canvas>       /*创建两个画布canvas,代号d1,d2*/
  <p><input type="button" value="make lime" onclick="dolime()">  <input type="button" value="make yellow" onclick="doyellow()"></p>              /*做两个按钮*/
canvas{
  width:200px;
  height:100px;
  border:1px solid #c3c3c3;
}
function dolime(){
  var canvas=document.getElementById("d1");
  var dd1=document.getElementById("d1");
  canvas.style.backgroundColor="lime";      /*画布背景色*/
  var ctx = dd1.getContext("2d");
  ctx.fillStyle="lightblue";                /*画出蓝色色块*/
  ctx.fillRect(10,10,40,40);                /*画出蓝色色块*/
  ctx.fillRect(60,10,100,100);              /*画出蓝色色块*/
  ctx.fillStyle="black";
  ctx.font="30px Arial";
  ctx.fillText("Hello World", 30, 50);
  ctx.clearRect(20, 20, 25, 100);     /*橡皮擦功能,相当于盖了一块透明画布*/
}

function doyellow(){
  var dd2=document.getElementById("d2");
  dd2.style.backgroundColor="yellow"
  var ctx=dd2.getContext("2d");
  ctx.fillStyle="lightblue";
  ctx.fillRect(10,10,40,40);
  ctx.fillRect(60,10,100,100);
  ctx.fillStyle="black";
  ctx.font="40px Arial";
  ctx.fillText("Hello",15,45);
}

橡皮擦功能**CanvasRenderingContext2D**.clearRect()

通过滑动杆,动态调整矩形大小

image.png

  <canvas id="d3"></canvas>
  <p><input type="button" value="change background" onclick="doyellow()"> <input type='color' value='#001A57' id='clr' onchange="docolor()"> <input type="range" min="10" max="100" value="10" id="sldr" oninput="dosquare()"> </p>
function docolor(){                              /取色器+改背景色功能/
  var dd3=document.getElementById("d3");
  var colorinput=document.getElementById("clr");
  var color=colorinput.value;
  dd3.style.backgroundColor=color;
}

function dosquare(){                             /滑动杆+可调大小的矩形功能/
  var dd3=document.getElementById("d3");
  var sizeinput=document.getElementById("sldr");
  var size=sizeinput.value;
  var ctx=dd3.getContext("2d");
  ctx.clearRect(0,0,dd3.width,dd3.height);
  ctx.fillStyle="lightblue";
  ctx.fillRect(10,10,size,size);
}

填充颜色context.fillStyle<br />
绘制矩形context.fillRect()

Share

国内外公司的招聘区别

1. 国内

  • 因为缺劳动力,喜欢问知识性问题,项目经历把用到的技术架构说清楚就好了,很少追问技术细节,喜欢吃苦耐劳、任劳任怨、能很快速上手干活的人,不关心员工的成长;
  • 如果是偏业务型的高级技术人员,需要对业务和行业比较了解,有丰富的业务项目经验;
  • 如果是偏技术部门的架构师和高级工程师,会问很多技术细节上的东西,问的很深,本质上还是知识型问题;
  • 技术知识储备:Java(并发编程、NIO、JVM、Spring、Netty框架)、Go(Effective Go)、Redis(数据结构、性能优化、高可用配置、分布式锁、官网的文章)、面向对象(设计模式中的23个模式)、分布式架构(CAP理论、微服务架构、弹力设计、Spring Cloud、Cloud Native)、网络编程(TCP/IP 3次握手、4次挥手、两端的状态变化、Socket编程的几个系统调用、select、poll、epoll等异步IO多路复用的东西)

    2. 国外

  • 两轮电话面试,工程师面写算法*2或第二轮是经理电话面,了解你的长处喜好和想法;

  • in-house面试一整天,最少5轮,其中3轮和技术相关(代码、算法、设计、架构、problem-solving),1轮经理(做过的项目,解决问题的能力,学习能力,思考方式),1轮HR面(性格、喜好、薪水);
  • 技术岗一定会让你写代码,无论多高级的职位。千万不要把代码写的和面条一样,至少要分模块函数,函数接口定义得清楚点,代码逻辑简介清楚,变量名好一点。完成后和面试官一起review代码,考察表达能力,最好用1-2个case讲解。分析一下代码的时间和空间复杂度,然后优化代码,包括bug和更高性能的算法。面试官通过这些了解你的思维方式和做事方式。还有一种是从一道简单的代码题开始,不断地加需求,改需求。建议先停下来和面试官讨论,然后开始重构代码。如果你让面试官看到是在case-by-case写代码,那完蛋了,这个过程是无法装的。
  • Competency-based interviews focus on your skills and experience - they ask what you can do and what you have done. Strengths-based interviews, on the other hand, ask what you are _good at _and what you _enjoy _doing.

    面试前的准备工作

    1. 需要了解的问题

  • 企业在市场上的地位

  • 业界对该企业的评价
  • 创始人或者创始团队背景
  • 你所在部门对企业的价值
  • 你胜任该岗位的优势

    2.岗位投递

  • 尊重自己,尊重机遇

  • 在了解清楚岗位空缺所关联的技能要求、职责后,匹配自己的特长去应聘,“货卖识家方为宝”
  • 检查自己对这个工作是否感兴趣,对我有价值吗?我喜欢跟这样一群人,在这样的文化下工作吗?这个职业的上升空间,能支持我的职业规划吗?

    3.简历要点

  • 面试官是在甄选一名能解决当前业务问题的人才,而不是一名优秀的全才,思考需要什么关键技能和加分技能

  • 好的简历有价值、易匹配、无硬伤、有亮点(在简历、面试中展现自己匹配所应聘岗位的过人之处,有打动面试官的能力素质和有价值的成果),从字里行间能看出对工作的深度理解和“技术味道”
  • 找亮点全局视角去看待自己工作和其他工作之间的联系(公司、客户、团队、个人)、量化结果找提高、复盘过程找创新、回顾挑战找动机。把亮点和相关经历融合在一起,总结成故事汇总到简历。
  • 自我简介(XX年软件开发经验、XX年团队leader经验、擅长XX、多年XX行业背景、任职于XX公司XX职位,负责XX平台XX系统)
  • 个人信息(gmail邮箱、个人网站、作品展)
  • 个人技能
  1. 技术栈(擅长的编程语言、编程框架或重要的库(Spring Boot、Netty、React.js、gRPC)、熟悉的技术软件(Redis、Kafka、Docker)、设计或架构(面向对象设计、分布式系统架构、异步编程、高性能调优))
  2. 技术领域(前端、算法、机器学习、分布式、底层、数据库)
  3. 业务领域(行业+业务)
  4. 经验和软技能(带过多少人的团队、有多少年的项目管理经验、学习能力如何、执行能力怎么样、设计过什么样的系统,几句话总结)
  • 工作经历和教育经历

    4. 准备面试问题

  • 简历上列出的基本技术细节要掌握,面试官会逐步加大难度和深度问,看你在哪个层次上。

  • 列出所有可能遇到的面试问题,就每个问题至少准备 2 个实际案例。
  • 提前把每个案例的细节重新回忆一遍,并用纸和笔写下来。
  • 面试前多在脑海中把过去的项目复盘,回忆起细节和技巧,是靠谱的思路。

面试过程中如何发挥

1. Respond to general questions

  • Recruiters are particularly attracted to driven graduates who are eager to develop their existing skills, learn new ones and pursue opportunities for personal and professional growth. Often, they’ll give you a chance to show this by asking a question like “where do you see yourself in five years?”… For example, you might mention your determination to master a new analytics program and apply it to a challenge currently facing the company.
  • For example, you could say something like: “I haven’t used [insert program/skill] yet, but I appreciate its importance to [insert relevant task], and I’m eager to learn more about it.’ Consider reinforcing this message by mentioning a previous occasion on which you have successfully learned a new skill and put it to use.

    2. 克服紧张心理

  • 每一场面试就是一场修行,也是一个难得的与别人深度交流的机会。作为候选人,完全可以放下包袱,摆正自己的心态,抓住这个机会去和面试官学习、交流。这样的话,哪怕最后没有被对方录取,但你可能因此而了解一个新的视角,或者熟悉一个新的领域,让自己在成长的道路上不断精进。”

  • 面试的本质:身份平等,实力说话,充分沟通,双向选择。找到最匹配自己的那个职位。不用为了某个公司、职位或面试官,刻意隐藏或改变什么,否则即使拿到offer并成功入职,在不合适的公司和工作中也不会感到开心。
  • 更加自信、挺直腰板、积极友好地与面试官交流,就像房屋中介一样把自己客观真实全面地介绍给企业,讲清楚自己对空缺岗位的理解,自己做出选择的逻辑链条,自己相对于这个空缺的价值,也提出合理的价位和其他诉求期望。有理有节有激情。

    3. 陌生环境下破冰

  • 不要等面试官让你介绍自己,化被动为主动,有礼貌的问:“我可以花一分钟时间做个自我介绍吗?”

  • 也可从时下热门问题切入,就像聊天一样,然后引出自己的思考,自然的介绍自己(难度较大)
  • 抛出容易被面试官认同的个人观点开始对话(难度较大)
  • 做自我介绍时,要努力让面试官被你吸引,让他佩服你,喜欢你

    4. 采用STAR原则回答

    简历关用于了解应聘者的技能和经验;
    面试关用于挖掘简历冰山下的其他信息,包括人的动机、胜任力和价值观。
    如何在面试中挖掘这些信息呢?
    通常会通过个人行为具体细节的深度挖掘,去预测未来的可能行为及表现。面试官希望听到面试者对自己过去事例的回忆和描述,不断就其中一些感兴趣的细节进行提问。STAR原则就是比较好的回答方式。
    (1)情景(Situation)
    这个任务 / 项目当时的背景是怎样的?
    什么外界和内部因素导致了这样的情形?
    当时都有哪些人员参与到这项任务 / 项目中?
    (2)任务(Task)
    在这个项目上你的主要角色是什么?
    你被安排的任务是什么?
    这样安排是为了达到什么目的?
    (3)行动(Action)
    你在这个项目中具体都做了哪些工作?
    这个项目当时面临的最大困难或障碍是什么?你怎么解决的?
    你还采取了哪些有效措施,确保最后的目标能顺利完成?
    (4)结果(Result)
    这个项目最后实现的结果是什么?
    你是用哪些指标来衡量项目成功的?
    你从这个项目上汲取了哪些教训?如果让你重新来过,你会如何做出差别?

    5. 面试官可能用来深挖细节的5WHY法则

  • 碰到不懂的技术问题,坦然承认,以后还需要继续学习;

  • 离职理由要强调你在工作上是尽责的,你的离开不是自己所希望的,而是受到客观条件的影响,自己被迫做出的决定;

    6. 需要咨询的问题

  • 企业的愿景和使命是什么,企业为何认为你比较适合该岗位?

  • 你的直接汇报对象是谁,什么岗位?
  • 所在团队有多少人,与你同级别的岗位有多少人?
  • 该岗位是新增(探索和磨合大,容易校正老板的期待,获得好评),补缺(工作细节清楚,职责明确,复用前任经验轻松上手,超越前任才能获得好评),还是人才储备?职位是为了解决什么问题,承担什么责任?
  • 这个角色的工作复杂度和挑战是什么,做出什么结果才算把这个角色做好?
  • How much of your working day will be spent working alone, and how much interacting with others?
  • Will you only have to deal with your immediate team and supervisor, or will you interact with internal or external clients?
  • Is this job more focused on meeting immediate, conflicting deadlines in a fast-paced environment, or longer-term planning and development work?
  • How flexible will you have to be, eg in terms of travel, working hours, or changing projects or picking up new skills at short notice?
  • What industry sector(s) will you be working in/for? Will you need to develop a working knowledge of, say, the finance sector or the retail industry?
  • Will training and development time be built into your job, or will you be expected to learn extra skills and keep up to date with new developments this in your own time?

    7.匹配度分析

  • 经验:这个职位,我能否上手创造价值?还是要经过1年半载的培训,面试官怎么看呢?

  • 技能:我的技能满足工作要求吗?面试官觉得我可以胜任吗?
  • 潜力:面试官觉得我将来能委以大任吗?
  • 动机:面试中,我表现得有激情、有动力、肯全心全意为公司效力吗?

    8. 谈薪

  • 面试前不要告知对方具体期望,要统一回答为面议。

  • 面试后可以根据当前薪资1.3-2倍报价(综合考虑该岗位在当前市场中的价位),并表示薪水期望可以根据成就感和成长空间进行调整。
  • HR制定和维护公司的薪资结构,职能经理决定你的职级,以及该级别规定的薪水区间决定你的薪水。虽然HR负责薪酬体系不被打破,但特别优秀的人才,职能经理可能会给他调到更高技能要求的职位,从而提高薪水。
  • 通过职场社区、招聘网站、朋友同学了解薪水区间(月薪和年薪,年终奖,股票期权,福利)
  • 了解职位的发展空间、对你的成长期望、同时表达自己的发展诉求,需要的资源和支持
  • 谈薪过程中需要表达自己能向企业提供的价值,并在合适的时候学会让步,而不是自己在市场上值多少钱。切忌一味的追求薪资,将自己宝贵的时间投入到不喜欢或不擅长的工作中。谈薪话语权放在关键问题上,如何展示自己的能力,让面试官相信你能解决他想解决的问题,你能为公司实现别人做不了的价值。
  • 注意,不是每次谈offer都成功的,即使谈不拢,也可以保留将来合作的机会。

    架构师能力模型

    核心:德(诚信、担当、品格)

    硬实力:

    1. 基础技术

  • 项目情况、画架构图

  • 围绕整个架构方案,深入了解技术能力:“先从 OSI 模型的应用层开始,通过负载均衡方案考查他对 CDN、DNS、VIP、HTTP、LVS、HAProxy、Keepalived、Apache、Nginx 的理解和熟练程度,中间也可以穿插问几个技术细节来考查他的理解深度,比如 Nginx 高并发的技术原理、Nginx 和 LVS 分别工作在 TCP/IP 协议栈的第几层,等等。”
  • Java关键技术点:“比如容器、JVM、数据结构、序列化、异常处理、Socket、多线程 / 并发、NIO 等等。在 Java 体系中,JVM 是最基础也是最重要的考查点,我们的系统最常出现的 OOM 异常都跟 JVM 有关,架构师必须深入了解 JVM 的内存模型、字节码、垃圾回收(GC)策略等原理,才能去优化 JVM 相关的性能问题,才能快速定位 OOM 类异常。除了 Java 基础技术,常用框架和相关概念也是需要考查的,比如 Spring、SpringMVC、Mybatis、ORM、IOC/DI、AOP 等。”
  • 应用层:结合功能模块,考察面向对象的设计和建模能力,比如类和类之间的关系、聚合和组合的区别。“详细说说某个功能模块的设计,画画 UML 设计图,这样能考查他对面向对象的理解程度和领域建模能力。领域建模能力对于架构师而言至关重要,业务域抽象得是否合理,是否高内聚,领域边界是否清晰,这些都是影响系统可扩展能力的关键要素。除了这些,我也会结合项目考查几个比较常用的设计模式,比如单例模式、工厂模式、策略模式、模板模式,等等。”
  • 存储层:“考查存储架构、数据库选型、数据库调优等。存储架构要看候选人是否能根据系统的并发量和数据量的需求设计适当的存储架构,是否需要做数据库分片,分片的原则和技术方案,是否需要引入 KV 引擎,是否需要做读写分离,是否需要做缓存,缓存需要做几层等等。数据库选型也是和具体的数据量和并发量有关,是用关系型数据库还是用 KV 引擎,还是要二者结合,等等。考虑到我们的系统大多还需要强依赖关系型数据库,所以一般都会考查一些关系型数据库的基础技术点,比如 MySQL 的架构、存储引擎、索引的数据结构、事务隔离级别、索引最左前缀原则等。还有就是要考查一些数据库端的性能优化技巧,比如 Explain 的用法、索引优化、SQL 语法优化、参数配置优化、数据模型优化、缓存优化等等。”

    2. 架构理解

  • 高并发设计,涉及系统的应用层、存储层和网络层。从网络 IO 到数据库 IO、数据库服务器的负载,CPU 和内存使用情况,再到应用层的负载均衡、反向代理、缓存、事务和锁、并发防重,以及应用服务器的负载,CPU 和内存使用情况。

  • 高可用设计,对负载均衡、SOA、微服务、服务治理的理解,所设计的服务接口其粒度、依赖、位置是否合理,服务是否设计了分组、动态管理、限流、降级和监控,整个架构方案中各模块之间的强依赖是否有降级方案等。
  • 在回答前,一定要问清楚需求,不要急着下结论。

    3. 发展能力

  • 对技术的热爱程度,通过候选人对一些开源组件的理解程度判断,一般对技术敏感、挚爱且有追求的架构师往往喜欢研究开源技术,时刻关注新技术并去实践,有的还会持续为开源社区贡献代码,这样的架构师是我们所喜爱的。

  • 有自己的时间任务管理心得,懂得识别风险、控制范围、估算时间和成本、把控质量,以及擅长多任务并发的管理与执行。
  • 有一个清晰的自我认知和职业规划,十分清楚地认识到自己的优势和不足,能充分发挥自身优势,不断补齐不足,知道自己追求的“和”不那么重要的,认识到为了达成目标的关键路径应该如何管理。

    软实力

运维面试

技术面

1. 自我介绍和基础知识

2. 项目经历

  • 对项目背景的了解程度
  • 对需求的合理性进行分析
  • 对技术设计方案的调研和选型(有亮点可循)
  • 取得的成效

    3. 编程技术

  • 代码风格、优雅程度、边界风格

  • 数据结构、算法的高效实现(几行代码的优化,就能提升用户体验,降低服务器成本,方便代码维护,减少兄弟们的工作量)
  • 结合候选人背景和公司业务特点,给出设计题目,评价技术迁移能力和综合素养
  • 逻辑或数学题目,考察思维习惯和逻辑能力
  • 对行业的理解,包括竞品、开源项目、同时看出学习态度(是否持续更新知识储备)

    主管面

    1. 软素质

    逻辑思维(阐述一个经历过的最有挑战的问题)、沟通能力(说服和影响,虚拟沟通或辩论,压力测试)、创新能力(发现传统方法的不足,尝试新的解决问题的方法,并获得成功)

    2.文化价值观

    乐观积极、善于合作(1+1>2)、追求极致(非钻牛角尖)