美文网首页
前端数组算法操作(部分更新中)

前端数组算法操作(部分更新中)

作者: 肥羊猪 | 来源:发表于2021-03-28 09:33 被阅读0次

合并两个有序数组:

// 新建一个空数组temp,数组长度表示为t,以及两个变量i, j标记两组数据当前比较值的下标进行对比,将比较小的值存入temp数组中,同时将下标和数值长度自增1
var arr1 = [1, 3, 5, 7, 9, 12, 15, 18]
var arr2 =  [2, 8, 11, 16, 19]
var i=0,j=0,arr=[]
while(i<arr1.length && j<arr2.length) 
{
    if(arr1[i]<arr2[j]){
        arr.push(arr1[i])
        i++;
        // arr.push(arr1[i++]) 另一种写法
        //var t= 0; arr[t++] = arr1[i++] 
    }else{
        arr.push(arr2[j])
        j++;
    }
}
if(i===arr1.length){
    arr = arr.concat(arr2.slice(j,arr2.length)) // slice 复制出新数组 concat 不会改变原数组
}
if(j===arr2.length){
   arr.push(...arr1.splice(i,arr1.length-i))// splice 截取数组 [...] 复制数组 push 返回长度
}


// 合并再排序
function concatArr(data1, data2) {
  var arr = [];
  var newArr = arr.concat(data1, data2).sort(function(a, b) {
    return a - b;
  });
  return newArr;
}

在数组中找到两个值相加,与目标值相同,返回这两个值的索引,且索引一少于索引二:

function twoSum( numbers ,  target ) {
    // write code here
    for(let i=0; i<numbers.length; i++){
      for (let j=i+1;j<numbers.length;j++){
          if (numbers[i]+numbers[j]==target)
             return [i+1,j+1]
      }
    }
}

数组反转:

// 定义一个新数组,把老数组中的元素反向添加到新数组中
function reverse(array){
       var newArr = [];
       for(var i=array.length-1;i>=0;i--){
           newArr[newArr.length] = array[i];//新数组里面累加旧数组最后一个开始
       }
       return newArr;
   }

//翻转原数组,直接修改原数组
   function reverse2(array){
       for(var i=0;i<array.length/2;i++){
           var temp = array[i];// 临时元素temp 等于当前元素
           array[i] = array[array.length-1-i];// 当前元素 等于对应的尾部位置
           array[array.length-1-i] = temp;// 尾部位置的元素等于临时元素
       }
       return array;   //Array对象中的方法返回了一个数组。
   }

数组去重:

Array.from(new Set(arr))
[...new Set(arr)] 

function arrayNonRepeatfy(arr) {
  let map = new Map();
  let array = new Array();  // 数组用于返回结果
  for (let i = 0; i < arr.length; i++) {
    if(map.has(arr[i])) {
        continue // 如果有该key值
    }else{
        map.set(arr[i], 1);   // 如果没有该key值
        array.push(arr[i]);
    }
  } 
  return array ;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
arrayNonRepeatfy(arr)

数组输出重复最大的次数,元素

function fnRepeat(ipLines) {
  var [obj, max, name] = [{}, 1, ''];
  ipLines.forEach(value => {
    if (obj[value]) {
      // 已经有值了 就把值+1
      obj[value]++;
      if (obj[value] > max) { // 判断重复次数有没有超过当前最高的
        max = obj[value]; // 重复次数
        name = value; // 当前元素
      }
    } else {
      // 没有值 就初始化一个值
      obj[value] = 1;
    }
  });
  return '重复次数:'+name+'\n重复最多的元素:'+max;
};

 fnRepeat(arr){
    let [max,maxKey,arrMap]=[0,null,{}]
    arr.forEach(item=>{
        if(arrMap.hasOwnProperty(item)){
            arrMap[item]++;// 存在加+1
        } else{
            arrMap[item]=1;// 不存在初始化1
        }
        if(arrMap[item]>max){
            max = arrMap[item]
            maxKey = item
        }
    })
    return '重复次数:'+max+'\n重复最多的元素:'+maxKey;
 }

获取连续递增序列最长的长度,入参字符串:

或者换种思路 后者-前者组成一个数组 找1连续重复最多的数量
 getLength(str){
// str "abc2234019A334bc"
    var arr = [],count=1,n=1// n为临时变量长度
    str = str.replace(/[^0-9]/ig,"")// 过滤字符串 数字
    arr = Array.from(str)// 一个字符串转数组
    for(let i=0;i<arr.length-1;i++){
        if(arr[i+1]-arr[i]===1){
            ++n;
        }else{
            if(n>count) count = n
            n=1
        }
    }
 }

判断一个数是不是素数:

function isSushu(num){
    var count=0;//记录整除的次数
    var i=2;
    while(i<num){
        if(num%i===0){
            count++;// 除了1和本身被整除 计数+1
            break;
        }
        i++;
    }
    if(count==0){
        console.log(num+"是素数");     
    }else{
        console.log(num+"不是素数");        
    }
 }

比较两个版本号:

版本号规则为'x.y.z' 至少有x位
compare('0.1','1.1.1.3')// -1
compare('12.1','1.3.1.1')// 1
compare('1.3','1.3.0')// 1

  compare(ver1, ver2) {
      try {
        if (!ver1 || !ver2) return 0;// 其他情况返回0
        const list1 = ver1.split("."),list2 = ver2.split(".")// 转为两个数组比较
        // 取最大的x数
        const size = Number(list1[0]) >= Number(list2[0]) ? Number(list1[0]) : Number(list2[0]);
        for (let i = 0; i < size; i++) {
          if (!list1[i])  list1.push("0");//如果没有数据 就占位0
          if (!list2[i])  list2.push("0");//如果没有数据 就占位0
          if (list1[i] === list2[i]) continue;// 如果两个数相等 就继续下一轮比较
          if (Number(list1[i]) > Number([list2[i]])) {// 如果list1元素大于list2
            return 1;// ver1大于ver2 返回 1
          } else {
            return -1;// ver1小于ver2 返回 -1
          }
        }
        return 0;// 其他情况返回0
      } catch (e) {
        return 0;
      }
    }

截取字符串:

// let tpl = '你好,我们国家是<% con.name %>,我们城市是<% city %>';
// let tplData = {
//   con: {
//    name: '中国'
//   },
//   city: '西溪北岸'
// }
// const str = renderTpl(tpl, tplData);
// console.log(str); // 最终输出结果为:你好,我们国家是中国,我们城市是西溪北岸。
function renderTpl(tpl, tplData) {
      const fun = (_tplData, parentsKey) => {
        if (!_tplData || typeof _tplData === "string") return; // 是字符串或者空就退出
        //Object.keys 返回一个所有元素为字符串的数组
        Object.keys(_tplData).forEach((key) => {
          //拿到key的数组然后遍历 布尔表达式 ? 值0:值1;
          // parentsKey = 指向当前节点的key 比如{a:{b:{c:3}}} 当前key是c parentsKey就是a.b
          // parentsKey 和key 对应 `${parentsKey}.${key}` a.b.c 用于匹配key字符串<% a.b.c %>
          const _key = parentsKey ? `${parentsKey}.${key}` : key; //拿到key或者下一层 深度遍历
          const tplKey = `<% ${_key} %>`; // 拿到规定的key字符串
          tpl = tpl.replace(tplKey, _tplData[key]); // key对应的值 替换 规定key字符串
          fun(_tplData[key], _key); // 遍历到叶子节点 
        });
      };
      fun(tplData, ""); // 第一个节点
      return tpl;
    }

// var tpl = 'my name is ${name},im from ${city}'
// var data = {name:'肥羊',city:'中国'}
sprintf(tpl,data)// "my name is 肥羊,im from 中国"

function sprintf(tpl,data){
    Object.keys(data).forEach(key=>{
        const tplKey = '${'+key+'}'// 取出定义的key
        tpl = tpl.replace(tplKey,data[key])// 用key对应的value值替换key
    })
    return tpl;
}

相关文章

网友评论

      本文标题:前端数组算法操作(部分更新中)

      本文链接:https://www.haomeiwen.com/subject/vveuhltx.html