导航:首页 > 源码编译 > 大厂考算法题

大厂考算法题

发布时间:2023-04-02 03:24:51

㈠ 大厂面试高频题:十进制有理数转二进制算法

十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。

2.十进制小数转换为二进制小数
十进制小数转换成二进制小数采用"乘2取整,高渗顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进吵派制小数的高位有效位,后取的整数升念贺作为低位有效位。

㈡ 大厂的前端面试难吗

分享给你一些面试题

一面

小米的面试官给人的感觉很亲切很真诚,是一个体验很不错的面试。

㈢ 大厂面试题详解:如何用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. 入门级

针对刚入门的同学,建议不要急着去看那些经典书,像《算法导论》、《算法》这些比较经典、权威的书。虽然书很好,但看起来很费劲,如果看不完,效果会很不好。所以建议先看两本入门级的趣味书:

阅读全文

与大厂考算法题相关的资料

热点内容
哺乳人妻电影日本在线播放 浏览:489
科技编译原理动画 浏览:643
精彩发现app里怎么投保意外险 浏览:145
美国电影爱情电影尺度大的 浏览:376
8个人在一个名为列车上 浏览:968
杨浦区少儿编程 浏览:944
免登录php网盘源码 浏览:422
王的命令在线观看全集 浏览:927
西安市社保卡APP叫什么 浏览:605
怎么关掉华为手机自动更新app 浏览:906
韩国19禁 浏览:180
有部电影叫什么长生 浏览:458
磁盘加密的过程中能使用吗 浏览:352
用乐高拼一个小小的解压球 浏览:22
显示服务器读取超时怎么办 浏览:501
残芯twrp解压密码 浏览:162
数控车智能编程 浏览:979
php正则表达式匹配任意字符 浏览:320
在文件夹什么word文档 浏览:991
刺激爱情片 浏览:644