本文是lhyt本人原创,希望用通俗易懂的方法来理解一些细节和难点。转载时请注明出处。文章最早出现于本人github
0. 前言
近来很多人来问,去哪里刷题啊,我毫不犹豫回答w3c和牛客网,适合入门和进阶。然后,一些人就说了一些看起来好像能过却总是过不了的题目,于是我去试一下,大概找到一些对于新人进阶遇到的可能有点小坑的题目。
1.正题
1.1删除数组中特定值算法挑战(初级)
要求:删除数组中的所有的假值。
js中,假值有false、null、0、""、undefined 和 NaN,加上本身的类型转换机制,假值最终可以转化为false!所以,一个个选的话就悲催了。
function bouncer(arr) {
for (var i = 0; i < arr.length; i++) {
if(!!arr[i] === false){
arr.splice(i,1);
i--;
}
}
return arr;
}
1.2对象搜索算法挑战(中级)
要求:写一个 function方法,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。注意:数组里面的对象出现的顺序不一定和第二个参数刚好顺序对应
我这里用了ES6的Object.entries方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历属性的键值对数组。
function where(collection, source) {
var arr = [];
var q = []
arr = collection.map(function(i){
return Object.entries(i).join()
})
_source = Object.entries(source)
var a = 0
for(var k = 0;k
for(var j = 0;j<_source.length;j++){
if(arr[k].indexOf(_source[j].join())!=-1){
a++
}
}
if(a == _source.length){
a = 0
q.push(collection[k])
}else{
a = 0
}
}
return q
}
也可以尝试JSON.stringify
1.3质数求和算法挑战(中级)
要求:求小于等于给定数值的质数之和。
这里用到了求质数的那个正则
function sumPrimes(num) {
var arr = []
var sum = 0
for (var i = 2 ;i < 1000;i++){
if(i<2?false:!/^(11+?)\1+$/.test(Array(i+1).join('1'))&&i<=num){
arr.push(i)
}
}
return arr.reduce(function(sum,n){
return sum += n
},0)
}
1.4最小公倍数算法挑战(中级)
要求:找到所提供参数的最小公倍数,这两个参数可以均匀分配,以及这些参数之间范围内的所有最小公倍数。
注意:范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
主要先了解最大公倍数和最小公约数的概念以及求法
function smallestCommons(arr) {
arr.sort(function(a,b){//先排序
return a-b
})
var n = arr[0]
var arr1 = []
var res
while(n<=arr[1]){//约数集合
arr1.push(n)
n++
}
function gcd( n,m ){
var qq = n*m //缓存两个数的乘积
function yue(n,m){
if( m == 0 ) return n; //辗转相除法
return yue( m, n % m );
}
return qq/yue(n,m)//最小公倍数=乘积/最大公约数
}
res = gcd(arr1[0],arr1[1] )//保留前面两个数的结果
for(var i = 2;i < arr1.length;i++){//操作整个范围所有的数
res = gcd(res,arr1[i])
}
return res
}
1.5数组平铺算法挑战
要求:对嵌套的数组进行平铺嵌套数组。你必须考虑到不同层级的嵌套。
这道题有点难度的,主要是处理{}和[],通过类型转换处理
function steamroller(arr) {
if (typeof arr[0] != 'number') {//全字母的情况(在这里只是全数字或者全字母,准确来说需要做更详细的判断)
return Array.apply(null,arr.join(',').split(','));
} else {
arr = arr.join().replace(/(,,)/g,',').split(',').map(function(n){//【】会转为两个逗号,,要去掉一个最后空数组平铺后就会不存在
return n*1;//转数字类型,+n也是一样
});
for (var i = 0;i
if(isNaN(+arr[i])){//如果是对象,对象转数字类型结果是NaN(+{}==NaN)
arr[i] = {}
}
}
}
return arr
}
1.6函数迭代可选参数算法挑战
要求:创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。如果两个参数都不是有效的数字,则返回 undefined。
这题类似于柯里化
function add() {
var sum = 0
var arr = [...arguments]
if(!arr.every(function(i){
return typeof i ==='number'//如果两个参数都不是有效的数字
})){
return undefined
}
if(arguments.length != 1){//参数大于1个
arr.forEach(function(n){
sum+= n
})
return sum
}
sum = arguments[0]//一个参数的情况
return function(){
return typeof arguments[0] =='number'? sum += arguments[0]:undefined
}
}
原文来自lhyt的github