面试官问出这几道算法题,你能扛住么?
Posted cloud、泡泡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试官问出这几道算法题,你能扛住么?相关的知识,希望对你有一定的参考价值。
写在前面
CSDN话题挑战赛第1期
- 活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f
- 参赛话题:前端面试宝典
- 话题描述:欢迎各位加入话题创作得小伙伴,如果我没有猜错得话,我觉得你是应该同我一样是一位前端人。如今前端在IT事业中的占比越来越重,已经成为不可缺少的部分,前端技术也是层出不穷,各种技术类、技术框架也蜂拥而出,前端面试的难度也随之增加,如果我们拥有一套前端面试宝典。如果你是应聘者:你就可以从容的solo面试官,如果你是面试官:你就可以将应聘者拷问到骨子里!
总之我们大家一起将自己的面试经验以及学习到的知识点汇聚于此,形成一套体系的前端面试宝典。让读者无论是面试还是学习都能够有非常大的收获。就让我们携手共筑前端面试宝典吧!!!
前言
现在的大厂越来越注重算法题,往往会被用来衡量你的代码能力,作为想要顺利拿到大厂offer的你,算法是必不可缺的一项技能,通过我的文章,带你刷爆剑指offer,吊打面试官,斩获大厂offer,以下的题目很多都是在字节跳动等大厂出现过的题目,大家可以学习一下!
剑指offer十题
题目一
剑指 Offer 03. 数组中重复的数字
题目链接:剑指offer03 力扣
考点
哈希表,排序
答案
哈希表是一种数据结构,也是散列表的一种,通过关键码值进行直接访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
这道题用到的就是哈希表,哈希表的结构是:number-boolean,number 就是数组中的数字,boolean 代表数字是否出现过,我们可以通过遍历数组中的数字,检查是否出现过,如果出现过,那么返回此数字。
代码如下:
/**
* @param number[] nums
* @return number
*/
var findRepeatNumber = function(nums)
const map = ;
for (const num of nums)
if (!map[num])
map[num] = true;
else
return num;
;
题目二
剑指 Offer 05. 替换空格
题目链接:剑指offer05 力扣
考点
双指针,字符串
答案
双指针算法 所谓双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向或者相反方向的指针进行扫描,从而达到相应目的,没学过的同学可以去学习一下。
先遍历一次字符串,统计出字符串中空格的总数,可以计算出替换之后的字符串的总长度,每替换一个空格,长度加2,替换以后字符串的长度等于原来的长度加上2*空格数
从后向前把字符串中的空格替换成%20。
/**
* @param string s
* @return string
*/
var replaceSpace = function(s)
if (s == null || !s.length)
return "";
s = s.split("");
let kongge = 0;
let i = 0;
while (i < s.length)
if (s[i] == " ")
kongge++;
i++;
let newLength = s.length - 1 + kongge * 2;
let indexOfOrigin = s.length - 1;
let indexOfNew = newLength;
while (indexOfOrigin >= 0 && indexOfNew > indexOfOrigin)
if (s[indexOfOrigin] == " ")
s[indexOfNew--] = "0";
s[indexOfNew--] = "2";
s[indexOfNew--] = "%";
else
s[indexOfNew--] = s[indexOfOrigin];
indexOfOrigin--;
return s.join("");
;
题目三
剑指 Offer 10- I. 斐波那契数列
题目链接:斐波那契数列 力扣
考点
动态规划,递推
答案
这道题是很经典的动态规划问题,是用动态规划来解决,不懂的小伙伴呢可以去学习一下这种解题思路。
我们通过计算可以推出状态转移方程dp[i] = dp[i - 1] + dp[i - 2]
dp[i]含义:斐波那契数列的第i个数为dp[i]
dp数组初始化:题目已经给出:分别是0和1
记得每次取模哦
const fib = n =>
const dp = [0, 1];
for (let i = 2; i <= n; i++)
dp[i] = (dp[i - 1] + dp[i - 2]) % 1000000007;
return dp[n];
;
题目四
剑指 Offer 10- II. 青蛙跳台阶问题
题目链接:力扣 跳台阶
考点
动态规划
答案
也是一道非常经典的动态规划问题,和斐波那契那题差不多,推一下状态转移方程
dp[i] = dp[i - 1] + dp[i - 2]
dp[i]含义:dp[i]是到第i层楼梯有多少跳法
dp数组初始化:两个1
在第 n - 2 层时,一次性跨两层(只有这一种爬法)
在第 n - 1 层时,一次性跨一层(只有这一种爬法)
/**
* @param number n
* @return number
*/
var numWays = function(n)
if(!n || n === 1)
return 1;
let dp = [1, 1];
for(let i = 2; i <= n; i++)
dp[i] = (dp[i - 1] + dp[i - 2]) % 1000000007;
return dp[n];
;
题目五
剑指 Offer 22. 链表中倒数第k个节点
题目链接:力扣力扣
考点
链表,双指针
答案
链表是一种链式存储的数据结构,链表的特性,使其在某些操作上很高效。例如当进行插入和删除操作时,链表操作的时间复杂度仅为O(1)。另外,因为链表在内存中不是连续存储的,所以可以充分利用内存中的碎片空间。
这道题目依旧还是使用双指针,让快指针先走k步,然后快慢指针开始前进,当快指针走到链表末尾时,慢指针所在的位置就是倒数第k个链表节点
/**
* @param ListNode head
* @param number k
* @return ListNode
*/
var getKthFromEnd = function (head, k)
let dummyNode = new ListNode(-1);
dummyNode.next = head;
let fast = dummyNode,
slow = dummyNode;
while (fast && k)
fast = fast.next;
k--;
while (fast)
fast = fast.next;
slow = slow.next;
return slow;
;
题目六
剑指 Offer 24. 反转链表
题目链接:力扣力扣
考点
链表,递归
答案
首先遍历所有的节点,然后存储下一个节点nextNode,把当前节点赋值为上一个节点,最后一个nextNode为null,就结束了。
/**
* Definition for singly-linked list.
* function ListNode(val)
* this.val = val;
* this.next = null;
*
*/
/**
* @param ListNode head
* @return ListNode
*/
var reverseList = function(head)
let preNode = null
let curNode = head
while (curNode)
const nextNode = curNode.next
curNode.next = preNode
preNode = curNode
curNode = nextNode
return preNode
;
题目七
剑指 Offer 27. 二叉树的镜像
题目链接:二叉树
考点
搜索,二叉树
答案
二叉树:树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为节点)按分支关系组织起来的结构。二叉树(Binary Tree)是每个节点最多有两个子树的有序树。通常子树被称作"左子树"(left subtree)和"右子树"(rightsubtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树不是树的特殊情形。在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根节点的度不大于2。有了根节点后,每个顶点定义了唯一的根节点,和最多2个子节点。然而,没有足够的信息来区分左节点和右节点,二叉树通过链式存储来保存值,遍历方法有前序遍历,中序遍历,后序遍历,深度优先搜索,广度优先搜索。
首先我们需要递归遍历原来这棵树的左子树和右子树。然后把这棵树的左节点赋给原来的右节点(对调换),直到节点为null为止。
/**
* Definition for a binary tree node.
* function TreeNode(val)
* this.val = val;
* this.left = this.right = null;
*
*/
/**
* @param TreeNode root
* @return TreeNode
*/
var mirrorTree = function(root)
if (root==null)
return null;
const l = mirrorTree(root.left);
const r = mirrorTree(root.right);
root.left = r;
root.right = l;
return root;
;
题目八
剑指 Offer 31. 栈的压入、弹出序列
题目链接:力扣力扣
考点
栈,数组,模拟
答案
栈:栈是一种操作受限的线性表只允许从一端插入和删除数据。栈有两种存储方式,即线性存储和链接存储(链表)。栈的一个最重要的特征就是栈的插入和删除只能在栈顶进行,所以每次删除的元素都是最后进栈的元素,故栈也被称为后进先出表。每个栈都有一个栈顶指针,它初始值为-1,且总是指向最后一个入栈的元素,栈有两种处理方式,即进栈(push)和出栈(pop),因为在进栈只需要移动一个变量存储空间。
这题我们用辅助栈stack模拟入栈的过程,每入一个就判断一次,入栈一次判断这个栈的栈顶是否和出栈的一致,一样的话这个数据就出栈,然后指针移到下一位比较
/**
* @param number[] pushed
* @param number[] popped
* @return boolean
*/
var validateStackSequences = function(pushed, popped)
let stack=[],i=0;
for(let n of pushed)
stack.push(n);
while(stack.length&&stack[stack.length-1]===popped[i])
stack.pop();
++i;
return stack.length===0;
;
题目九
剑指 Offer 53 - I. 在排序数组中查找数字 I
题目链接:力扣力扣
考点
数组,map,二分
答案
这道题可以用map,也可以用二分,看个人的理解~
我们这里使用对象存储,遍历一遍数组,当查找key有对应的value时,value+,否则就表明该数字第一次出现,将value设置为1,最终输出的结果要考虑结果是否在数组。
/**
* @param number[] nums
* @param number target
* @return number
*/
var search = function(nums, target)
let map =
for(let item of nums)
if(map[item])
map[item]++
else
map[item] = 1
let res = map[target] ? map[target] : 0
return res
;
题目十
剑指 Offer 64. 求1+2+…+n
题目链接:力扣!
考点
位运算。
答案
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
我们这里使用递归解决,&& 特性:如果左边为 false,不执行右边; 左边为true继续执行右边。
/**
* @param number n
* @return number
*/
var sumNums = function(n)
return n&&sumNums(n-1)+n;
;
写在最后
写文不易~ 如果你觉得对你有帮助的话可以给我来个点赞收藏关注支持一下,我会继续输出优质内容,算法的学习之路是要坚持下去的,不要轻易的放弃,你也可以做到吊打面试官。
CSDN话题挑战赛第1期
腾讯面试官问出几个测试逻辑题,打我一个出其不意,还好我早有准备!
金三银四,估计现在应该有很多同学在找工作或者换工作的过程中,那么肯定是要经过面试这一关的。 现在很多公司面试,都要求做笔试题。其中有软件测试的基本知识考察,也有不少逻辑推理题,不知道大家有没有遇到过,小编之前面试过程中是遇到了好几次了, 今天整理了几道与大家一起分享。
第一题
题目:
有12品脱啤酒一个(品脱是英容量单位,1品脱=0.568升),想从中倒出6品脱。但是没有6品脱的容器, 只有一个8品脱的容器和一个5品脱的容器。怎样的倒法才能使8品脱的容器中恰好装入6品脱啤酒?
参考答案:
第一种解法:从12品脱容器中将8品脱容器倒满,12品脱容器中还剩4品脱;将8品脱的酒倒满5品脱的容器,8品脱容器还剩3; 将5品脱容器中的酒全部到进12品脱容器,此时12品脱容器里面为4+5=9;
将8品脱中的剩下的3品脱酒倒入5品脱容器; 将12品脱容器中的9品脱酒倒满8品脱容器,此时12品脱容器剩下1品脱;
将8品脱中的酒倒满5品脱容器,此时8品脱容器剩余6品脱;将5品脱容器中的酒全部倒入12品脱容器, 这样8品脱的容器中恰好装入6品脱啤酒。
第一种解法,表格示意:
第二种解法:从12品脱容器中将8品脱容器倒满,12品脱容器中还剩4品脱;将12品脱容器中的剩余的4品脱酒全部倒入5品脱容器; 将8品脱容器中的8品脱酒全部倒入12品脱容器;
将5品脱容器中的4品脱酒全部倒入8品脱容器;将12品脱倒入5品脱容器使5品脱容器装满,此时12品脱容器为8-5=3品脱;从5品脱容器中倒入4品脱酒使8品脱容器装满, 此时5品脱容器为5-1=1品脱;
将8品脱容器中的8品脱酒全部倒入12品脱容器,此时12品脱容器为3+8=11品脱; 将5品脱容器中的1品脱酒倒入8品脱容器;
从12品脱容器中倒5品脱容器使5品脱容器装满,此时12品脱容器为11-6=6品脱; 将5品脱容器中的5品脱酒全部倒入8品脱容器,此时8品脱容器为1+5=6品脱;
第二种解法,表格示意:
第二题
题目:
米米是只小馋猫,有一天晚上, 他在梦到一条小河里淌着醇香的牛奶。他想喝牛奶,可发现没带杯子。这时找到两个圆柱形的容器,一个容量是3升,另一个容量是10升,前者的高度正好是后者的一半。它们是用高硬度不渗透的材料制成的, 重量很沉,但其厚度薄到可以忽略不计。米米把其中的一个容器装满牛奶,然后结合使用另一个容器,量出了恰好1升牛奶。在这个过程中,米米没有再用容器从河中装过牛奶,原来装回的牛奶始终都在容器中, 没有失去一滴。米米是如何量出这1升牛奶的?
参考答案:
解题:由条件已经知道小容器的高度是大容器的一半,而大容器一半的容量是5升,当小容器放入大容器中后,大容器中围绕着小容器的环形部分的容量是2升, 多出的1升就流入小容器之中。
也就是说,用小容器装满3升牛奶;把这3升牛奶全部倒入大容器中;把空的小容器口朝上放进大容器的底部;这时,大容器中的牛奶溢过小容器的口而再流入小容器; 这样流入小容器中的牛奶正好是1升。
第三题
题目:
在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?
参考答案:
解题:23次,因为分针要转24圈, 时针才能转1圈,而分针和时针重合两次之间的间隔显然>1 小时,它们有23次重合机会,每次重合中秒针有一次重合机会,所以是23次重合时间可以对照手表求出, 也可列方程求出。
第四题
题目:
你面前放着一桶绝妙的伦敦白啤酒。手中有两个大盅,一个能盛5品脱,另一个能盛3品脱。请你们说说看,不允许使用任何别的容器或设备,也不许在盅子上做记号。怎样斟酒, 使得每个盅里都恰好有1品脱?
参考答案:
解题:首先,把两个盅子都斟满,然后让桶里剩下的啤酒都倒出(流尽的啤酒量不影响本题的解)。
桶中的酒全部倒出后, 并将3品脱盅子内的酒全部倒回桶中,再把大盅的酒往小盅倒掉3品脱,并把这3品脱酒倒回桶中,大盅剩下的2品脱酒倒往小盅,桶里的酒注满大盅(5品脱),这样桶里只剩1品脱。
再把大盅的酒注满小盅(只能倒出1品脱),喝完小盅里的酒,从大盅往小盅倒3品脱,大盅里剩下1品脱,喝完小盅的酒,最后把桶里剩的1品脱酒注人小盅内。
第五题
题目:
三个小伙子同时爱上了一个姑娘, 为了决定他们谁能娶这个姑娘,他们决定用手枪进行一次决斗。小李的命中率是30%,小黄比他好些,命中率是50%,最出色的枪手是小林,他从不失误,命中率是100%。由于这个显而易见的事实,为公平起见,他们决定按这样的顺序:小李先开枪,小黄第二,小林最后。 然后这样循环,直到他们只剩下一个人。那么这三个人中谁活下来的机会最大呢?他们都应该采取什么样的策略?
参考答案:
解题:对于100%的小林而言策略很简单,先干掉50%的小黄,再干掉30%的小李胜算最高,只需2枪。
对于50%的小黄来说, 自己一定是小林的优先击杀对象,所以第一枪一定对小林开,中了可以在后手的情况下与小李对决,没中就完蛋了。
对于30%的小李来说第一枪应该对着小林开以表示与小黄共同对付强敌,但是要故意不命中。因为如果命中自己将在后手的情况下面对小黄。因为自己最菜, 所以不会成为其他2人的优先击杀对象,所以要等2人之中有一人倒下之后才认真开枪。最理想的情况是小黄击倒小林,之后先手对小黄!
实力最强的小林因为自身强大和后手,被迫先后与2人决斗,胜率只有35%,而小黄迫于小林的压力必须先和小林对决,之后还要和小李后手对决,胜率也只有25%, 最弱的小李因为自身特点和正确的策略可以拥有40%胜率!
我整理了一份216页软件测试大厂面试题,以及2021推荐最新的简历模板,送给小伙伴们,关注公众号软件测试小dao自行领取,和一些小伙伴建立一个技术交流群,一起探讨技术,分享技术资料,旨在共同学习进步,如果感兴趣就加入我们吧!1033482984
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
以上是关于面试官问出这几道算法题,你能扛住么?的主要内容,如果未能解决你的问题,请参考以下文章