js算法题
<script>
varpeachCount=getPeachOfDay(1)
console.log("第一天共有桃子数:",peachCount)
functiongetPeachOfDay(day){
if(day==10){
return1;
}
return(getPeachOfDay(day+1)+1)*2;
}
</script>
答案:1534
附::猴子吃桃问题
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上在想吃时,就只剩一个桃子了。求第一天共摘了多少个桃子?
❷ js算法题,不知道该怎么写,希望大神能出来帮忙解答下
(function(){
functiontest(x){
lety;
for(y=0;y<=255;y++){
if(parseInt(x+""+y)%97==1){
break;
}
}
returny
}
functionrandom(min,max){
letn=max-min老亮+1
returnMath.ceil((Math.random()*n))-1+孝含伍min
}
letx=random(0,999999)
return巧或parseInt(String(x)+String(test(x)))%97===1&&0<=test(x)&&test(x)<=255
})()
x是一个随机数,要求x 和 test(x) 拼接(不是相加)起来的数字处以97刚好余1,并且test(x)大于等于0小于等于255
❸ 前端算法入门一:刷算法题常用的JS基础扫盲
此篇属于前端算法入门系列的第一篇,主要介绍常用的 数组方法 、 字符串方法 、 遍历方法 、 高阶函数 、 正则表达式 以及相关 数学知识 。
在尾部追加,类似于压栈,原数组会变。
在尾部弹出,类似于出栈,原数组会变。数组的 push & pop 可以模拟常见数据结构之一:栈。
在头部压入数据,类似于入队,原数组会变。
在头部弹出数据,原数组会变。数组的 push(入队) & shift(出队) 可以模拟常见数据结构之一:队列。
concat会在当前数组尾部拼接传入的数组,然后返回一个新数组,原数组不变。
在数组中寻找该值,找到则返回其下标,找不到则返回-1。
在数组中寻找该值,找到则返回true,找不到则返回false。
将数组转化成字符串,并返回该字符串,不传值则默认逗号隔开,原数组不变。
翻转原数组,并返回已完成翻转的数组,原数组改变。
从start 开始截取到end,但是不包括end
可参考 MDN:Sort
将数组转化成字符串,并返回该字符串,逗号隔开,原数组不变。
返回指定索引位置处的字符。类似于数组用中括号获取相应下标位置的数据。
类似数组的concat(),用来返回一个合并拼接两个或两个以上字符串。原字符串不变。
indexOf,返回一个字符在字符串中首次出现的位置,lastIndexOf返回一个字符在字符串中最后一次出现的位置。
提取字符串的片断,并把提取的字符串作为新的字符串返回出来。原字符串不变。
使用指定的分隔符将一个字符串拆分为多个子字符串数组并返回,原字符串不变。
match()方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,并返回一个包含该搜索结果的数组。
注意事项 :如果match方法没有找到匹配,将返回null。如果找到匹配,则 match方法会把匹配到以数组形式返回,如果正则规则未设置全局修饰符g,则 match方法返回的数组有两个特性:input和index。input属性包含整个被搜索的字符串。index属性包含了在整个被搜索字符串中匹配的子字符串的位置。
replace接收两个参数,参数一是需要替换掉的字符或者一个正则的匹配规则,参数二,需要替换进去的字符,仔实际的原理当中,参数二,你可以换成一个回调函数。
在目标字符串中搜索与正则规则相匹配的字符,搜索到,则返回第一个匹配项在目标字符串当中的位置,没有搜索到则返回一个-1。
toLowerCase把字母转换成小写,toUpperCase()则是把字母转换成大写。
includes、startsWith、endsWith,es6的新增方法,includes 用来检测目标字符串对象是否包含某个字符,返回一个布尔值,startsWith用来检测当前字符是否是目标字符串的起始部分,相对的endwith是用来检测是否是目标字符串的结尾部分。
返回一个新的字符串对象,新字符串等于重复了指定次数的原始字符串。接收一个参数,就是指定重复的次数。原字符串不变。
最常用的for循环,经常用的数组遍历,也可以遍历字符串。
while、do while主要的功能是,当满足while后边所跟的条件时,来执行相关业务。这两个的区别是,while会先判断是否满足条件,然后再去执行花括号里面的任务,而do while则是先执行一次花括号中的任务,再去执行while条件,判断下次还是否再去执行do里面的操作。也就是说 do while至少会执行一次操作 .
拷贝一份遍历原数组。
for…of是ES6新增的方法,但是for…of不能去遍历普通的对象, for…of的好处是可以使用break跳出循环。
面试官:说一下 for...in 和 for...of 区别?
返回一个布尔值 。当我们需要判定数组中的元素是否满足某些条件时,可以使用every / some。这两个的区别是,every会去判断判断数组中的每一项,而 some则是当某一项满足条件时返回。
rece 从左到右将数组元素做“叠加”处理,返回一个值。receRight 从右到左。
Object.keys方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名,且只返回可枚举的属性。
Object.getOwnPropertyNames方法与Object.keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。但它能返回不可枚举的属性。
这里罗列一些我在刷算法题中遇到的正则表达式,如果有时间可认真学一下正则表达式不要背。
持续更新,敬请期待……
若一个正整数无法被除了1 和它自身之外的任何自然数整除,则称该数为质数(或素数),否则称该正整数为合数。
持续更新,敬请期待……
作者:摆草猿
链接:https://juejin.cn/post/7087134135193436197
❹ JS算法专题 - 树的层序遍历
先看看leetcode上的几道题目,关键字 层序遍历 ,其实就是把一棵树一层一层地遍历,取出每一个节点。当然从根节点到叶子节点,从叶子节点到根节点,每层从左到右,从右到左……都可以衍生成不同的题目。
102. 二叉树的层序遍历
107. 二叉树的层序遍历 II
429. N 叉树的层序遍历
这一类的题目,被归纳在leetcode的 广度优先搜索 标签下
这一类的题目,总结起来可以套用模板来解决,我们需要借用一下数据结构的知识:
队列 :先进先出,后进后出
在JavaScript中,我们会使用 数组Array 来模拟队列:
先初始化一个 二叉树
先看看102的题目
解题:
从以上例子,只要步骤是:
有一个细节要注意:
这里用的是 pop() 和 unshift() ,是因为队列先进先出的特点,pop()从最后面弹出一个元素,unshift()把新元素放到最前面。 push() 和 shift() 搭配也有相同效果。
107的题目稍微改变了一下,要求输出是[[15,7], [9,20], [3]],可以看出,就是把102的从上到下输出每一层节点,改成从下到上输出,首先想到的就是把102的数组反转就可以了。
但是,我们可能直接在保存结果数组的时候处理一下:
102中,我们使用 push() 把每一层的节点放入结果数组
107中,结果数组和102的反转了,所以,我们可以把 push() 改成 unshift() 即可,最后得到的结果就是,树的要节点那盯源衡层在结果数组的最后,叶子节点在最前面。
429题中把二叉树改成了N叉树,树的结构发生了变化
但是可以看到,和二叉树的数据结构相比,就是把left和right合成children,那么在我们的模板中,也只需要修改一下
改成
这样就可以得到结果了。
想一下,如果再改一下:如何从右到左遍历每一层节点凯做?层数是单数时从左到右,层数是双数时从右到左?
再扩展一下,这个算法能做什裂做么呢?
当我们玩游戏,特别是走迷宫之类的游戏,是不是会从一个点出发,然后判断下一步能不能走,直到找出终点?BFS也是寻路方案的基础。
推荐一下leetcode上的总结:
二叉树层序遍历登场:我要打十个!
❺ js面试题
1.eventLoop
2.setTimeout 误差原因
3.深浅拷贝
4.跨域原因及解决方案
5.css放在头部,js放在尾部
6.css触发bfc
7.webpack plugin和loader区别
8.前端优化
9.协商缓存
10.长列表优化
11.webview交互
12.vue响应式原理
13.原型
14.算法题:数组中有n个元素,排列
EventLoop是计则扒没算机系统的运行机制,js就是运行这个机制,因为js是单线程语言,所以一旦遇到一个耗时很长的任务就会卡住,js为了解决这个问题就有了EventLoop
Event Loop是一个程序结构,用于等待和发送消息和事件。
就是在程序中有了两个线程,一个负责应用本身,主线程,另一个负责此悉主线程和其它进程,称为EventLoop
1、js是单线程语言
基本数据类型存放在栈中的简单数据段
引用数据类型存放在堆中的对象
因为定时器是宏任务,如果执孙纳行栈的时间大于定时器花费的时间,那么定时器的回调在 宏任务(macrotask) 里,来不及去调用,所有这个时间会有误差。所以就会有误差
宏任务是宿主发起的比如script,setTimeout
css放在头部是因为页面加载html生成dom树的时候就可以同时对dom树进行渲染,防止闪跳,白屏
js放在尾部是因为js会修改dom树,需要一个稳定的dom树
BFC是css的一个布局概念,块级格式化上下文
浮动float不为none的时候
定位为position:absolute和fixed的
display的时候
overflow不为visible
解决浮动父元素坍塌问题
解决自适应布局的问题
解决外边距垂直方向重合问题
loader是文件加载器,运行在nodejs中,并对文件进行打包,压缩转换
plugin是插件,用于拓展webpack的功能
浅拷贝有两种定于,第一种是赋值,第二种是拷贝对象的第一层属性,深层还是一样的
深拷贝是指将对象拷贝一份,无论如何修改都不会改变原有的
响应式原理就是当数据发生改变的时候视图也会跟着更新
VUE是利用了Object.defineProperty的方法里面的setter 与getter方法的观察者模式来实现。