js练习1 --- 函数数组

Posted 我爱你,程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js练习1 --- 函数数组相关的知识,希望对你有一定的参考价值。

目录

index.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title></title>
  <script src="./problem.js"></script>
</head>
<body></body>
</html>

第一题

题目:实现函数的重载。以Array数据类型的splice函数为例,用arguments数组来实现删除,插入和替换三个功能。(不能直接使用splice函数)。

problem.js

let arr = [2,4,6,7,22,14,17,9,1,3];

function splice_customize() 
  let args = Array.prototype.slice.apply(arguments); //将args转为真正的数组
  if(args.length <= 0) 
    console.log("至少要有一个参数!");
    return;
  
  let index = args[0];
  switch(args.length) 
    //一个参数,就是从数组下标index开始后面元素全删
    case 1:
      arr = arr.slice(0,index);
      break;
    //两个参数,第一个参数指定数组下标index,第二个参数指定要删多少个元素
    case 2:
      let num = args[1];
      if(index+num > arr.length) 
        console.log("无法删这么多元素!");
      else 
        arr = [...arr.slice(0,index),...arr.slice(index+num,arr.length)];
      
      break;
    //三个参数,第一个参数指定数组下标index,第二个参数指定要删多少个元素,第三个元素指定要插入的元素
    default:
      let num2 = args[1];
      let elements = args.slice(2,args.length);
      if(num2 == 0) 
        //插入元素
        arr = [...arr.slice(0,index),...elements,...arr.slice(index,arr.length)];
      else if(num2 > 0) 
        //替换元素
        if(index+elements.length > arr.length) 
          console.log("无法替换这么多元素!")
         else 
          arr = [...arr.slice(0,index),...elements,...arr.slice(index+elements.length,arr.length)];
          
      else 
        console.log("第二个参数不能为负数!")
      
  


//测试
splice_customize();
splice_customize(8);
console.log("从数组下标8开始往后全部删除后:"+arr);
splice_customize(1,20);
splice_customize(5,2);
console.log("从数组下标2开始往后删2个元素:"+arr);
splice_customize(3,0,88,88,88);
console.log("从数组下标3开始往后插入3个元素:"+arr);
splice_customize(4,2,99,99);
console.log("从数组下标4开始往后替换2个元素:"+arr);
splice_customize(1,-1,5);
splice_customize(6,5,5,5,5,5,5);

第二题

题目:使用迭代方法替代for循环。假设数组[4,6,12,8,10],设定相应的条件(2的幂指数),实现every, some, filter和map四种迭代方法。(map:每个元素增加10%)

problem.js

let arr = [4,6,12,8,10];

//every的实现
let isEvery = arr.every(item => 
  return item > 0 && ((item & (item-1)) == 0); //(item & (item-1)) == 0用于判断该元素是不是2的N次方
);
if(isEvery) 
  console.log('数组里面的元素都是2的幂指数');
 else 
  console.log('数组里面的元素不都是2的幂指数');


//some的实现
let isSome = arr.some(item => 
  return item > 0 && ((item & (item-1)) == 0);
);
if(isSome) 
  console.log('数组里面的元素存在2的幂指数');
 else 
  console.log('数组里面的元素不存在2的幂指数');


//filter的实现
let newArr = arr.filter(item => 
  return item > 0 && ((item & (item-1)) == 0); 
)
console.log(newArr); //将是2的幂指数的元素筛选出来并打印

//map的实现
let newArr2 = arr.map(item => 
  return Math.round(item*1.1*100)/100; //每个元素增加10%,并保留两位小数
)
console.log(newArr2); 

题目:编写noRepeat()函数,删除数组中重复元素,将剩余元素升序排列后,返回新的数组。

problem.js

let arr = [2,3,5,5,8,8,24,17,9,3,9];

//去重并排序
function noRepeat(array) 
  const set = new Set(array);
  return [...set].sort((a,b)=>
    return a-b;
  );

console.log(noRepeat(arr))

题目:利用两个栈模拟实现一个队列。 

problem.js 

 //用两个栈模拟实现一个队列
function Queue() 
  let stack1 = [], stack2 = [];
  //元素入队,这里实际上是元素压入栈1
  this.push = function(element)
    stack1.push(element);
  
  //元素出队,这里实际上是栈1元素全部出栈,依次压入栈2,然后栈2栈顶弹出一个元素
  this.pop = function()
    if(stack1.length == 0) return;
    while(stack1.length !== 0)
      stack2.push(stack1.pop());
    
    let elem = stack2.pop();
    //元素出队之后,再把元素从栈2压回栈1
    while(stack2.length !== 0)
      stack1.push(stack2.pop());
    
    return elem;
  
  // 检查队列是否为空
  this.isEmpty = function () 
    return stack1.length == 0
  
  // 返回队列的长度
  this.size = function () 
    return stack1.length;
  

//测试
let queue = new Queue();
queue.push(2);
queue.push(3);
console.log('出队元素:' + queue.pop());
console.log('队列长度:' + queue.size());
queue.push(4);
queue.pop();
console.log('出队元素:' + queue.pop());
console.log('队列长度:' + queue.size()); 

以上是关于js练习1 --- 函数数组的主要内容,如果未能解决你的问题,请参考以下文章

算法练习(二分查找/排序)

算法练习(二分查找/排序)

js练习1 --- 函数数组

JS数组排序

OJ练习第60题——合并 K 个升序链表

JS数组之重排序方法