为了方便理解,这里用一个数组作为例子,即[1,2,3,4,5,6,7,8,9,10,11];
要求:根据一个参数K,每K个数据进行一次反转,并且要求从尾部开始,即从11开始,每K个元素一组进行一次反转,如果个数不够K个,不进行反转,返回最终结果
那么首先能想到的就是递归,接下来就是确定函数要解决的问题步骤
1.从数组尾部开始,获取K个元素作为一组,如果个数够K个,命名为foot对象,剩下的部分保留不动,如果不够则返回参数
2.将foot对象中的元素反转
3.将保留部分作为递归函数的参数,并将反转后的foot对象加在后面
也许看到上面还是没法立刻动手写代码,那么先降低难度,不要求从尾部开始,而从头部开始,那步骤就是
1.从数组头部开始,获取K个元素作为一组,如果个数够K个,命名为head对象,剩下的部分保留不动,如果不够则返回参数
2.将head对象中的元素反转
3.将保留部分作为递归函数的参数,并将反转后的head对象加在前面
let a=[1,2,3,4,5,6,7,8,9,10,11];
function fn(obj){
if(obj.length>2){
let head=new Array(obj.slice(0,3).reverse());
let temp=obj.slice(3);
return head+","+fn(temp);
}else{
return obj;
}
}
console.log(fn(a));//3,2,1,6,5,4,9,8,7,10,11
成功实现了从头部开始的反转,那么只要将获取head对象变为获取foot对象,就能达到从尾部开始反转的目的
function fn2(obj){
if(obj.length>2){
let foot=new Array(obj.slice(obj.length-3,obj.length).reverse());
let temp=obj.slice(0,obj.length-3);
return fn2(temp)+","+foot;
}else{
return obj;
}
}
console.log(fn2(a));//1,2,5,4,3,8,7,6,11,10,9
本篇文章灵感来自于一篇java的面试算法题,与这个类似,有兴趣的可以搜搜看,实际解题思路与本人的不太一样