来几个js的简单算法

本文分享了作者参加今日头条面试时遇到的三道算法题及其解答过程,包括嵌套数组的打平去重、对象属性路径转换及两个有序数组的合并与排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一阵去今日头条面试,两轮面试官都让手撕算法,撕完了还要在电脑上能运行,这倒是提醒我了一点,不能因为前端对算法要求没有客户端高就忽视它,只要是一个软件开发人员,就一定要有良好的算法基础。话不多说,现在来撕吧,哈哈哈~

第一题

嵌套数组打平并且去重,类似于这样
[3,2,4,5,6,1,5,4,[9,5,3,2,[10,4,6]]]=>[3,2,4,5,6,1,9,10]
能想到的数组去重方法挺多的,常规的有这么几种:
1.构建一个新的数组存放结果,for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比,若结果数组中没有该元素,则存到结果数组中。
2.先将原数组进行排序,检查原数组中的第i个元素与结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置,如果不相同,则将该元素存入结果数组中。
3.创建一个新的数组存放结果,创建一个空对象,for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为-1,存入到建立的对象中。
这里使用的是最后一个方法。对于嵌套数组的话,可以判定元素类型是否是数组类型然后利用递归解决。代码如下:
var arr = [3,2,4,5,6,1,5,4,[9,5,3,2,[10,4,6]]];
var newArr = [];
var obj = {};
function setInobj (arrx,n) {
    for(var i=0;i<n;i++){
        if(arrx[i] instanceof Array){
            setInobj(arrx[i],arrx[i].length);
        }
        else{
             if(!obj[arrx[i]]){
                newArr.push(arrx[i]);
                obj[arrx[i]] = -1;
            }
        }
    }
}
setInobj(arr,arr.length);
console.log(newArr);//[3,2,4,5,6,1,9,10]

第二题

类似于这种形式
{
     a : {
        b : 1,
        d : {
            e : 2
        }
    },
    f : 3,
    g : {
        h : 4
    }
}
最 后 输 出:  
{
    'a/b' : 1,
    'a/d/e' : 2,
    'f' : 3,
    'g/h' : 4
}
这个题刚开始觉得挺简单的,跟上面思路一样啊,利用递归,但是后来发现它要处理类似索引的那个东西,很傻的研究了半天,结果突然灵机一动就给写出来了,代码如下:
var preObj = {
    a : {
        b : 1,
        d : {
            e : 2
        }
    },
    f : 3,
    g : {
        h : 4
    }
};
var newObj = {};
function setInobj (obj,name) {
    for(var i in obj){
       if(typeof obj[i] == 'number'){
          if(name !== ''){
            newObj[name + '/' + i ] = obj[i];
          }
          else{
            newObj[i] = obj[i];
          }
       }
       else{
          if(name !== ''){
            setInobj(obj[i],name + '/' + i);
          }
          else{
            setInobj(obj[i],i);
          }
       }
    }
}
setInobj(preObj,'');
console.log(newObj);//{ 'a/b': 1, 'a/d/e': 2, f: 3, 'g/h': 4 }
其中name表示前面的索引值

第三题

两个有序数组进行合并,排序,不能使用concat,sort方法。
当时写的时候忽视了有序数组这个条件,直接利用push进行连接两个数组,然后利用优化冒泡来解决的。后来面试官引导我看有没有什么别的办法,我才注意到有序数组的条件,然后我就说了想法,他也没让我再实现(哈哈哈哈~~),不过每次面完都得总结一下,代码如下:
var arr1 = [1,5,6,9],arr2 = [3,5,7];
var temp;
for(var i = 0;i < arr1.length-1;i++){
   if(arr2[0] >= arr1[i] && arr2[0] <= arr1[i + 1]){
      temp = arr1[i];
      arr1.splice(i,1,temp,arr2[0]);
      arr2.shift();

   }
}
console.log(arr1);//[ 1, 3, 5, 5, 6, 7, 9 ]
事实证明要记住数组常用的方法是很有用的,要不得实现好长一串代码。
等电话的过程好难熬啊啊啊啊啊,加油加油吧!
贪心算法是一种简单且常用的算法思想,在解决一些优化问题时非常高效。下面是几个经典的使用贪心算法的例子: 1. 找零钱问题:假设有一定面额的硬币,如1元、5元、10元、20元等,并且数量无限。现在要找给客户m元的零钱,如何使用最少的硬币数量?贪心算法的思想是从面额最大的硬币始尽可能多地使用。 2. 区间调度问题:给出一组区间,求解最多能够选择多少个互不重叠的区间。贪心算法的思想是按照区间的结束时间排序,然后依次选择结束时间最早的区间。 3. 最小生成树问题:给出一个无向图,边带有权值,求解一个最小生成树,即含有所有顶点的连通子图并且权值和最小。贪心算法的思想是从一个任意顶点始,每次选择一条权值最小的边,并且要保证不构成回路。 4. 背包问题:给出一组物品,每个物品有自己的价值和重量,并且背包只能承受一定的重量。现在要选择一些物品放入背包中,使得总价值最大。贪心算法的思想是按照物品的单位价值(价值/重量)排序,然后依次选择单位价值最高的物品放入背包。 以上是几个常见的使用贪心算法的经典例子。贪心算法虽然简单,但并不一定能够得到全局最优解,它只能得到局部的最优解。因此,在使用贪心算法时需要注意验证其正确性,并且多结合其他算法思想进行优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值