㈠ 大厂面试高频题:十进制有理数转二进制算法
十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
2.十进制小数转换为二进制小数
十进制小数转换成二进制小数采用"乘2取整,高渗顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进吵派制小数的高位有效位,后取的整数升念贺作为低位有效位。
㈡ 大厂的前端面试难吗
分享给你一些面试题
一面
小米的面试官给人的感觉很亲切很真诚,是一个体验很不错的面试。
css 实现图片自适应宽高
讲 flex,手写出 flex 常用的属性,并且讲出作用
BFC 是什么
项目里面的前端鉴权是怎么实现的?
vue 里面的虚拟 dom 是怎么回事?
vue 双向绑定讲一讲
手写函数防抖和函数节流
讲讲常用的 es6 语法,比如 let、promise、class 等等
浏览器渲染过程,回流重绘等等,load、DOMContentLoaded 等等事件的触发顺序
从小米应用商店里面随便找了一个需求让我现场实现,写伪代码
二面
讲项目里面的鉴权和图片懒加载怎么实现的
讲 vue-lazyloader 的原理,手写伪代码
讲 express 框架的设计思想
线上日志是如何处理的
讲事件循环
讲 nodejs 的 eventEmitter 的实现
三面
讲项目里面做的事情
讲 vue 的响应式原理、依赖收集、监听数组、虚拟 dom 等等
讲 express 的中间件系统是如何设计的
现场从小米应用商店中找出一个需求现场实现,说思路,写关键的代码
四面
讲 vue-lazyloader 源码以及设计
使用 es5 实现 es6 的 class
websocket 握手过程
浏览器的事件循环和 nodejs 事件循环的区别
百思编程(过)
这个公司是猎头推荐的,CEO 比较强势,也算比较有趣。
一面
跨域以及解决办法
手写一段小算法
javaScript 的 sort 方法内部使用的什么排序?
二面
这一面是 CEO 面,主要问了我的职业规划等等问题,在我没有表现出很强的要去该公司的意愿后,直接给我送走了…
ponyAI-基础架构(过)
一面
讲项目里面干了啥
vue-lazyloader 怎么实现的
vue 的响应式系统、虚拟 dom
函数式编程
手写了一个算法题
二面
这轮面试时从美国打电话过来的,事后才知道是 Google 的前端…
讲讲项目里面做了什么
vue 原理,和 react 的区别(其实我没怎么用过 react)
JavaScript 异步的处理方式,现场出了一个问题,使用 promise 实现
三面
讲项目模块规划、项目如何部署、如何优化等等
手写函数的防抖
手写一道算法题
四面
讲讲项目
手写一道算法题
洋钱罐(过)
一面
讲项目
前端持久化的方式、区别
vue-lazyloader 的原理
怎么配 webpack
手写 vue 双向绑定
讲 es6 的一些特性,并且现场出了几个代码片段,说结果
手写一道算法题
http 状态码
二面
讲项目
vue-router 的原理
项目中怎么用的 webpack,怎么优化
讲 express 的设计原理
手写一道算法题
创新奇智(过)
一面
讲项目
手动实现 parseInt
二面
这一面居然遇到了前同事…写了一些笔试题,问了一些问题!
三面
讲 tcp/ip 网络层、三次握手,为什么不能两次握手
讲 vue 原理
手写一道算法题
猿辅导(跪)
猿辅导好像总共就一面,期间一些实现方式和面试官有争议(没有冲突)。
一面
手写 vue 的 mixin 方法
手写 promise 的 all 方法
现场出了一个移动端的小需求
搜狐-垂直媒体部门(过)
一面
讲项目
项目里面用 nodejs 做了啥
抽取了哪些 vue 组件
二面
讲项目
手写实现 promise
腾讯-地图(跪)
腾讯两个部门面试都会先做一套笔试题,笔试题基本就是一些常见的前端问题以及算法题
三面
讲项目,对项目提了一些问题
怎么判断一个点是否在圆形内、正方形内
对笔试题
腾讯-天天快报(跪)
也是先做了一套笔试题,但是令人尴尬的是,面试官觉得我快排写错了,然而我只是在原地快排没有申请额外空间…
笔试题
没了
网络-网络云(过)
这个部门今年据说升为一级部门了,好像还挺不错的~
一面
讲项目
vue 响应式原理,什么是 mvvm
es6 使用过的特性
flex 常见的属性
css 选择器的优先级
抽取过哪些 vue 组件
二面
讲项目
express 设计原理,面试官对动态路由匹配一直追问下去,但是这里的源码设计我确实是忘了,一路讨论下去扯到了字符串的前缀树…
实现一个事件发布订阅类,其实就是 eventEmitter
三面
三面是山大老学长,聊了一些业务上的事情~
搜狗-手机搜狗(过)
搜狗一面的体验比较差,面试官给人的感觉不太好…
一面
讲项目
事件循环
回调函数的坏处
vue 里面哪儿不会用到双向绑定
二面
忘了…
快手-商业化(过)
一面
讲项目
如何抽取公共组件的
vue 的响应式原理
如何实现一个可设置过期时间的 localStorage
实现一个发布订阅系统,包括 on、emit、off 等等
二面
一道智力题
软件工程思想、设计模式等等
async/await 代码片段,说输出结果
今日头条-广告系统(过)
一面
讲项目
讲 lazyloader 实现
用 docker 做了什么
用 webpack 做了什么
手写一个算法题
讲 flex
vue 响应式原理
es6
二面
JavaScript 异步
优化项目
vue 原理,包括计算属性、依赖收集等等
用 JavaScript 的异步实现 sleep 函数
算法题
三面
手写快排,时间复杂度,优化
手写实现 jsonp
项目部署,线上问题等等
websocket 握手过程
四面
对 vuex 的理解,单向数据流
设计一个单点登录的系统,类似阿里系那种
手写一个算法
五面
实现一个联想搜索组件
手写函数防抖和节流
OPPO 成都研发中心(过)
一面
讲项目
讲 vue 的 响应式系统,讲了好久,从渲染 watcher 到虚拟 dom,面试官还跟我讨论了好久
忘了
二面
讲项目
忘了
百词斩(跪)
首先会在线做一道算法题,挺简单的,百词斩感觉挂的稀里糊涂的…
一面
websocket 握手过程
tcp/ip 网络层,http 的特点
http 强行使用 udp 能实现吗?
vue 原理
webpack 热更新原理,使用过的插件
原型、闭包、跨域
手写了一道算法题
为什么面这么多公司
因为我是实习直接转正的,也没参加过秋招,所以对自己在市场上是个怎样的实力没有一个清晰的了解,而且我也想多了解一下其他公司在做什么,于是就尽量的多面,不过说实话面试确实挺累的。
㈢ 大厂面试题详解:如何用Redis实现分布式锁
说一道常见面试题:
一个很简单的答案就是去使用 Redission 客户端。Redission 中的锁方案就是 Redis 分布式锁得比较完美的详细方案。
那么,Redission 中的锁方案为什么会比较完美呢?
正好,我用 Redis 做分布式锁经验十分丰富,在实际工作中,也 探索 过许多种使用 Redis 做分布式锁的方案,经过了无数血泪教训。
所以,在谈及 Redission 锁为什么比较完美之前,先给大家看看我曾经使用 Redis 做分布式锁是遇到过的问题。
我曾经用 Redis 做分布式锁是想去解决一个用户抢优惠券的问题。这个业务需求是这样的:当用户领完一张优惠券后,优惠券的数量必须相应减一,如果优惠券抢光了,就不允许用户再抢了。
在实现时,先从数据库中先读出优惠券的数量进行判断,当优惠券大于 0,就进行允许领取优惠券,然后,再将优惠券数量减一后,写回数据库。
当时由于请求数量比较多,所以,我们使用了三台服务器去做分流。
这个时候会出现一个问题:
如果其中一台服务器上的 A 应用获取到了优惠券的数量之后,由于处理相关业务逻辑,未及时更新数据库的优惠券数量;在 A 应用处理业务逻辑的时候,另一台服务器上的 B 应用更新了优惠券数量。那么,等 A 应用去更新数据库中优惠券数量时,就会把 B 应用更新的优惠券数量覆盖掉。
看到这里,可能有人比较奇怪,为什么这里不直接使用 SQL:
原因是这样做,在没有分布式锁的协调下,优惠券数量可能直接会出现负数。因为当前优惠券数量为 1 的时候,如果两个用户通过两台服务器同时发起抢优惠券的请求,都满足优惠券大于 0 每个条件,然后都执行这条 SQL 说了句,结果优惠券数量直接变成 -1 了。
还有人说可以用乐观锁,比如使用如下 SQL:
这种方式就在一定几率下,很可能出现数据一直更新不上,导致长时间重试的情况。
所以,经过综合考虑,我们就采用了 Redis 分布式锁,通过互斥的方式,以防止多个客户端同时更新优惠券数量的方案。
当时,我们首先想到的就是使用 Redis 的 setnx 命令,setnx 命令其实就是 set if not exists 的简写。
当 key 设置值成功后,则返回 1,否则就返回 0。所以,这里 setnx 设置成功可以表示成获取到锁,如果失败,则说明已经有锁,可以被视作获取锁失败。
如果想要释放锁,执行任务 del 指令,把 key 删除即可。
利用这个特性,我们就可以让系统在执行优惠券逻辑之前,先去 Redis 中执行 setnx 指令。再根据指令执行结果,去判断是否获取到锁。如果获取到了,就继续执行业务,执行完再使用 del 指令去释放锁。如果没有获取到,就等待一定时间,重新再去获取锁。
乍一看,这一切没什么问题,使用 setnx 指令确实起到了想要的互斥效果。
但是,这是建立在所有运行环境都是正常的情况下的。一旦运行环境出现了异常,问题就出现了。
想一下,持有锁的应用突然崩溃了,或者所在的服务器宕机了,会出现什么情况?
这会造成死锁——持有锁的应用无法释放锁,其他应用根本也没有机会再去获取锁了。这会造成巨大的线上事故,我们要改进方案,解决这个问题。
怎么解决呢?咱们可以看到,造成死锁的根源是,一旦持有锁的应用出现问题,就不会去释放锁。从这个方向思考,可以在 Redis 上给 key 一个过期时间。
这样的话,即使出现问题,key 也会在一段时间后释放,是不是就解决了这个问题呢?实际上,大家也确实是这么做的。
不过,由于 setnx 这个指令本身无法设置超时时间,所以一般会采用两种办法来做这件事:
1、采用 lua 脚本,在使用 setnx 指令之后,再使用 expire 命令去给 key 设置过期时间。
2、直接使用 set(key,value,NX,EX,timeout) 指令,同时设置锁和超时时间。
以上两种方法,使用哪种方式都可以。
释放锁的脚本两种方式都一样,直接调用 Redis 的 del 指令即可。
到目前为止,我们的锁既起到了互斥效果,又不会因为某些持有锁的系统出现问题,导致死锁了。这样就完美了吗?
假设有这样一种情况,如果一个持有锁的应用,其持有的时间超过了我们设定的超时时间会怎样呢?会出现两种情况:
出现第一种情况比较正常。因为你毕竟执行任务超时了,key 被正常清除也是符合逻辑的。
但是最可怕的是第二种情况,发现设置的 key 还存在。这说明什么?说明当前存在的 key,是另外的应用设置的。
这时候如果持有锁超时的应用调用 del 指令去删除锁时,就会把别人设置的锁误删除,这会直接导致系统业务出现问题。
所以,为了解决这个问题,我们需要继续对 Redis 脚本进行改动……毁灭吧,累了……
首先,我们要让应用在获取锁的时候,去设置一个只有应用自己知道的独一无二的值。
通过这个唯一值,系统在释放锁的时候,就能识别出这锁是不是自己设置的。如果是自己设置的,就释放锁,也就是删除 key;如果不是,则什么都不做。
脚本如下:
或者
这里,ARGV[1] 是一个可传入的参数变量,可以传入唯一值。比如一个只有自己知道的 UUID 的值,或者通过雪球算法,生成只有自己持有的唯一 ID。
释放锁的脚本改成这样:
可以看到,从业务角度,无论如何,我们的分布式锁已经可以满足真正的业务需求了。能互斥,不死锁,不会误删除别人的锁,只有自己上的锁,自己可以释放。
一切都是那么美好!!!
可惜,还有个隐患,我们并未排除。这个隐患就是 Redis 自身。
要知道,lua 脚本都是用在 Redis 的单例上的。一旦 Redis 本身出现了问题,我们的分布式锁就没法用了,分布式锁没法用,对业务的正常运行会造成重大影响,这是我们无法接受的。
所以,我们需要把 Redis 搞成高可用的。一般来讲,解决 Redis 高可用的问题,都是使用主从集群。
但是搞主从集群,又会引入新的问题。主要问题在于,Redis 的主从数据同步有延迟。这种延迟会产生一个边界条件:当主机上的 Redis 已经被人建好了锁,但是锁数据还未同步到从机时,主机宕了。随后,从机提升为主机,此时从机上是没有以前主机设置好的锁数据的——锁丢了……丢了……了……
到这里,终于可以介绍 Redission(开源 Redis 客户端)了,我们来看看它怎么是实现 Redis 分布式锁的。
Redission 实现分布式锁的思想很简单,无论是主从集群还是 Redis Cluster 集群,它会对集群中的每个 Redis,挨个去执行设置 Redis 锁的脚本,也就是集群中的每个 Redis 都会包含设置好的锁数据。
我们通过一个例子来介绍一下。
假设 Redis 集群有 5 台机器,同时根据评估,锁的超时时间设置成 10 秒比较合适。
第 1 步,咱们先算出集群总的等待时间,集群总的等待时间是 5 秒(锁的超时时间 10 秒 / 2)。
第 2 步,用 5 秒除以 5 台机器数量,结果是 1 秒。这个 1 秒是连接每台 Redis 可接受的等待时间。
第 3 步,依次连接 5 台 Redis,并执行 lua 脚本设置锁,然后再做判断:
再额外多说一句,在很多业务逻辑里,其实对锁的超时时间是没有需求的。
比如,凌晨批量执行处理的任务,可能需要分布式锁保证任务不会被重复执行。此时,任务要执行多长时间是不明确的。如果设置分布式锁的超时时间在这里,并没有太大意义。但是,不设置超时时间,又会引发死锁问题。
所以,解决这种问题的通用办法是,每个持有锁的客户端都启动一个后台线程,通过执行特定的 lua 脚本,去不断地刷新 Redis 中的 key 超时时间,使得在任务执行完成前,key 不会被清除掉。
脚本如下:
其中,ARGV[1] 是可传入的参数变量,表示持有锁的系统的唯一值,也就是只有持有锁的客户端才能刷新 key 的超时时间。
到此为止,一个完整的分布式锁才算实现完毕。总结实现方案如下:
这个分布式锁满足如下四个条件:
当然,在 Redission 中的脚本,为了保证锁的可重入,又对 lua 脚本做了一定的修改,现在把完整的 lua 脚本贴在下面。
获取锁的 lua 脚本:
对应的刷新锁超时时间的脚本:
对应的释放锁的脚本:
到现在为止,使用 Redis 作为分布式锁的详细方案就写完了。
我既写了一步一坑的坎坷经历,也写明了各个问题和解决问题的细节,希望大家看完能有所收获。
最后再给大家提个醒,使用 Redis 集群做分布式锁,有一定的争议性,还需要大家在实际用的时候,根据现实情况,做出更好的选择和取舍。
原文 https://www.cnblogs.com/siyuanwai/p/16011836.html
㈣ android 面试,算法题。
final int size = data.length;
for(int i = 0; i< size; i++){
if(data[i] == 0xffffffff)
data[i] = 0x80ffffff;
}
不知道你是不是这个意思。
㈤ java面试算法题一定考吗
主要看你面试的公司是什么类型的公司.外包公司一般考的都是基础题,要是面试的公司有自己的项目,并且做自己的产品.就有可能考算法题.但是大部分公司还是不考算法的.放心吧 .哈哈
㈥ 非计算机专业考华为od算法题难不难
华为od算法题难度中下,更倾向于考验临场发挥能力。
华为OD的面试首先会有一轮机考,机考是在牛客网上做编程题。总共三道题,据说是一道简单两道中等,总分400分,150分以上就算通过。
OD的机考难度不算特别高,如果经常刷牛客和力扣上的题的话,至少及格肯定是没问题的。考题的偏好的话,基于自己做的和参考其他的OD考试帖子,感觉比较喜欢考数组和字符串的问题,大家刷题可以着重注意一下这种类型的题!
㈦ 刷LeetCode对于国内IT企业面试帮助大吗
就目前的情况来看,国内公司社招面试中,对于对于算法的考验越来越多,很多公司会拿leet code的原题用于面试。
根据我的了解,目前国内的中型厂记下的基本上不会考验算法题不会哪一道编程题,让你手写指示会咨询你一些项目经验,包括一些基础的数据库类的知识,或者是编程基础类知识,比如说你用Java开发怎么会问你spring cloud的spring boot相关知识,还有一些可能会问你高并发,生产问题处理,linux服务器命令等等,手撕红黑树的情况不多。
对于国内的这些外资企业微软、虾皮等等,可能会问一些算法题,但一般都不会特别难。数据结构问链表二叉树,算法问动态规划之类的吧,也是min和easy难度。
对于头部的大厂可能会出一些hard级别的算法题,或者是改编过的编程题。目前程序员的人数越来越多,所以未来可能会有更多的公司会通过手撕编程题的方式进行面试。
对于校招来说说来的时候呢,是非常有帮助的,听不起。各大公司的面试题中都会有算法题,所以必须要通过刷leetcode来提升自己的。有可能你会遇到一些原题。
不管怎么样说算法题都是很有帮助的,有助于提升编码能力和逻辑能力,可以让你的编码能力一直保持一个不错的水平,因为很多人平时都是curd小子,很多基础知识都忘记了包括算法能力。
leetcode上题很多,逐渐你会发现刷题太耗时间,所以建议采用哈夫曼树规则。高频题优先,各个tag刷10题以上掌握典型题总结算法套路,先把触手放在能掌握的地方。然后再去重点刷贪心和dp,分类好思路和模板。再去牛客搜公司名刷一些该公司面试题,有个底不至于面试没见过。建议medium为主,easy和hard为辅。
一零言,聊聊IT,谈谈技术
㈧ 大公司笔试面试有哪些经典算法题目
1、二维数组中的查找
具体例题:如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列?
㈨ 阿里面试官:恕我直言,搞懂这10道算法题,轻松拿20K不是问题
01打怪兽
难度:容易
现在有3只怪兽,他们的都有自己的血量a,b,c(1<=a,b,c<=100),当Tom打死第一怪兽的时候花费的代价为0,其余的怪兽的代价为当前的怪兽的血量减去上一个怪兽的血量的绝对值。问Tom打死这些怪兽所需要的最小代价
02数组变换
难度:中等
给出一个长度为 n 的数组,和一个正整数 d。 你每次可以选择其中任意一个元素 a[i] 将其变为 a[i] + d 或 a[i] - d,这算作一次操作。你需要将所有的元素全部变成相等元素,如果有解,请输出最小操作次数,如果无解请输出-1。
01超级区间
难度:中等
Tom现在有一个长度为n的数组,Jerry给Tom定义了一种超级区间,如果区间[l,r]满足(a[l]+…+a[r])>=k,则区间[l,r]被称为超级区间,现在Jerry想让Tom告诉他数组中有多纤岩少个超级区间。
02能量半径
难度:中等
codancer来到了一个能量平面上的中心,坐标为(0,0),接下来巫师Tom会在q个坐标上放置能量点,每个信凳能量点的能量值为1,为了打败哥斯拉,他需要至少k点的能量,因此他想确定一个最小的整数半径r使得codancer能够从这个圆心为(0,0),半径为r的圆形区域内得到至少k个能量值,请你帮他确定最小的整数半径r。
01找出二叉搜索树的第2大的数
难度:容易
给定一个二叉搜索树,找出其第二大的数。
02字符配对
难度:中等
给你一个字符串,字符串中仅包含"A","B",现在有四种字符串"AA","AB","BA","BB",每种字符串都有他们的权值,问从给出的字符串中能够得到的最大权值为多少(一个字符只能属于一个子字符串)?
01斐波那契字符串
难度:中等
Tom发现了一种神奇的字符串-斐波那契字符串,定义f[1]=0,f[2]=1,对于所有的i>2都有f[i]=f[i-2]+f[i-1],其中“+”代表拼接,比如01+10=0110,现在对于字符串f[n],请判断f[n]的第k项是0,还是1?
01Hikari and Interstellar Experience
难度:容易
在无垠的宇宙中,有 n 个星球,第 i 个星球有权值vi 。由于星球之间距离极远,因此想在有限的时间内在星际间旅行,就必须要在星球间建立传送通道。 任意两个星球之间均可以建立传送通道毁坦御,不过花费并不一样。 第 i 个星球与第 j 个星球的之间建立传送通道的花费是lowbit(vi ⊕ vj) ,其中⊕为二进制异或,而lowbit(x)为 x 二进制最低位的值,例如lowbit(5) = 1,lowbit(8) = 8 。 特殊地,lowbit(0) = 0。 Hikari 想在这 n 个星球间穿梭,于是――你需要告诉 Hikari,要使这 n 个星球相互可达,需要的花费最少是多少?
02二进制字符串
难度:中等
Tom得到了一个二进制字符串s,即s只由Ɔ'和Ƈ'组成,现在令d(t)代表二进制字符串t在十进制下的值。 那么d(“011”)=3,d(“0001000”)=4,如果t的长度等于d(t),那么就称t是奇妙串,现在Tom想知道s中有多少个子串是奇妙串?
01小明的数学作业
难度:容易
众所周知,小明是一个数学小能手,有一天数学老师给了小明一个长度为n(2<=n<=5000)的序列,其中第i个数是ai(0<=ai<=1e9),数学老师想知道这个序列排序后,其中最长的等差子序列的长度是多长,聪明的你能帮小明解决这个问题吗?
02Codancer上楼
codancer来到了一栋大楼前,现在他要上楼。
如果codancer从第x层走楼梯到第y层(y>x),那么他所花费的时间是a[x]+a[x+1]+…+a[y];
如果他从x层坐电梯到第y层,那么他所花费的时间是c+(b[x]+b[x+1]+…+b[y]),因为他等电梯的时间为c。
现在codancer想知道从第1层到第n层需要最少需要多长时间?
01变换的秘钥
难度:中等
Tom最开始有一个密钥s1,s1是长度为n的由小写字母组成的字符串。Jerry也有一个长度为n的由小写字母组成的密钥s2。现在有m组关系,每组关系由两个数字[u,v]构成(1<=u,v<=26),表示26个字母表中的第u个小写字母可以直接转换为第v个小写字母。假设u=1,v=2,那么说明字母'a'可以直接转换为字母'b'。现在Tom对于s1的每个字母使用无数次转换,请判断s1能否转换为s2?
01最大边权和
难度:简单
现在有n个点(1<=n<=1000),每个点都有一个值称为点权ai(ai为偶数,1<=ai<=1000),现在可以将任意两个点相连,连起来以后这条边也有一个值称为边权,这个边的边权为这两个点的点权之和的一半。现在需要你添加n-1条边,问将这n个点连通以后(连通是指任意两个点都能互相到达)的最大的边权和是多少?
02钱庄
难度:中等
钱庄每天能够收到很多散钱,第i个散钱的值2 wi。为了便于管理,钱庄每天都会向中央银行申请兑换钱币,假设钱庄有一些散钱使得2 k1+2 k2+...+2 km=2^x(x为非负整数),那么就可以将这些散钱兑换成一个大钱币,问在钱庄收到的这些散钱最终最少能变成几个钱币?
01codancer的旅行
难度:困难
期末考试终于结束啦,Codancer开始了他的旅行,现在整个地图上有n个城市,这些城市之间有n-1条道路相连,每条道路都有一个距离,并且保证整个图是连通的,即这个地图可以看作是一棵树,现在假设Codancer要从城市A到城市B,那么他的路费就是从A-B的路径上边权最大的边的权值wmaxx元。现在Codancer有k元,他想知道他能选择那些(A,B)并且A<B使得codancer能够到达?
HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。
01全奇数组
难度:中等
codancer现在有n个正整数a[1],a[2]…a[n],Tom告诉codancer他可以进行下列操作,选择某个偶数x,把这n个数中全部等于x的数字除2,Tom想知道把这n个数字全部变成奇数最少需要几次这样的操作?
以上十道算法题你都能搞定嘛?备战大厂每日刷一道算法题来提升自己,坚持坚持再坚持,必然会有收获。为大家整理一份781页的高分宝典,知识较为全面,可分享给想要学习提升自己的朋友。
领取方式:私信【面试宝典】或点击右方链接: https://shimo.im/docs/QVy8HrQgPYkx9Ddg/ 即可免费领取,喜欢本文不妨关注+转发支持一下~~
㈩ java数据结构书籍推荐
1. 入门级
针对刚入门的同学,建议不要急着去看那些经典书,像《算法导论》、《算法》这些比较经典、权威的书。虽然书很好,但看起来很费劲,如果看不完,效果会很不好。所以建议先看两本入门级的趣味书:
《大话数据结构》
《算法图解》
大话数据结构
将理论讲的很有趣,不枯燥。作者结合生活中的例子去对每个数据结构和算法进行讲解,让人通俗易懂。
算法图解
这是一本像小说一样有趣的算法入门书,书中有大量的图解,通俗易懂。
看完上面一本或两本入门级的书,你就会对数据结构和算法有个大概认识和学习。但这些入门级的书缺少细节、不够系统。所以想要深入的学习数据结构和算法,光看这两本书肯定是不够的。
2. 不同语言的教科书
国内外很多大学都是将《数据结构和算法分析》作为教科书。这本书非常系统、严谨、全面,难度适中,很适合对数据结构和算法有些了解,并且已经掌握了至少一门语言的同学学习。针对不同的语言,分别有:
《数据结构与算法分析:C语言描述》
《数据结构与算法分析:C++描述》
《数据结构与算法分析:java语言描述》
如果你不会C、C++、java,会Python或者JavaScript,可以看:
《数据结构与算法JavaScript描述》
《数据结构与算法:Python语言描述》
3. 面试书籍
现在很多大厂的面试都会考算法题,这里推荐几本面试算法书籍:
《剑指offer》
《编程珠玑》
《编程之美》
剑指offer
为面试算法量身定做的一本书。几乎包含了所有常见的、经典的面试题,如果能搞懂书里面的内容,一般公司的算法面试都应该没问题。
编程珠玑
这本书豆瓣评分有9分,评分很高。这本书最大的特色是讲了很多海量数据的处理技巧。其他算法书籍很少涉及海量数据。
编程之美
有些作者是微软工程师,算法题目较难,比较适合要面试Google、Facebook这样的公司的人去看。
4. 经典书籍
现在数据结构与算法最经典的书籍就是:
《算法导论》
《算法》
《计算机程序设计艺术》
这三本书非常经典,但都很厚,看起来比较费劲,估计很少有人能全部看完。但如果想更深入地学一遍数据结构和算法,还是建议去看看。
算法导论
章节安排不是循序渐进,里面有各种算法正确性、复杂度的证明、推导,对数学功底有一定要求,看起来有些费劲。
算法
偏重讲算法。内容不够全面,对数据结构方面的知识讲的不多,动态规划这么重要的知识点却没有讲。
计算机程序设计艺术
这本书包括很多卷,相比于其他书籍有更好的深度、广度、系统性和全面性。但如果你对数据结构和算法不是特别感兴趣,没有很好的数学、算法、计算机基础,很难把这本书读完、读懂。
5. 课外阅读
有些算法书籍也比较适合在平时悠闲的时候翻翻看看:
《算法帝国》
《数学之美》
《算法之美》
这些书都列举了大量的列子来解释说明,非常通俗易懂。