面试算法题

目录

火花:


题目
若干人(Person对象)进行分组,每4人为一组,不够4人则直接成组。 若最后剩余0人,则正好4人一组。最后剩余1人,则把上一4人组与这1人进行组合,一组2人一组3人。若最后剩余2人,则把上一4人组与这2人进行组合,每组3人。若最后剩余3人,则此3人为一组。
结果:打印出每组成员

let divideGroup = function(arr){
    const len = arr.length, NUM = 4,result = [];
    const reminder = len % NUM;
    if(len <= 4){
      result.push(arr.slice(0))
      return result
    }

    for(var i=0; i<len-reminder; i+=4){
       result.push(arr.slice(i, i+NUM))
    }
   
   if(reminder === 1){
     result.pop()
      result.push(arr.slice(-5, -3))
      result.push(arr.slice(-3))
    }else if(reminder === 2){
     result.pop()
      result.push(arr.slice(-6, -3))
      result.push(arr.slice(-3))
    }else if(reminder === 3){
      result.push(arr.slice(len-reminder))
    }

    return result;
    
}

2.用JavaScript写一个函数,输入int型,返回整数逆序后的字符串。如:输入整型1234,返回字符串“4321”。要求必须使用递归函数调用,不能用全局变量,输入函数必须只有一个参数传入,必须返回字符串。

function reverseNumber(num){
    let num1 = num / 10;
    let num2 = num % 10;

    if(num1 < 1){
        return num;
    }else{
        num1 = Math.floor(num1)
        return  `${num2}${reverseNumber(num1)}`
    }
}

3. 传入字母和*组成的数组,如['a', 'b', 'c', '*', '*', 'd'],字母为一组,*号为一组,然后翻转数组,即返回['d', '*', '*', 'a', 'b', 'c']
 

/**
* arr 数组
**/
function reverseArr(arr){
    // lastIndex 为从右到左*号的位置
    let lastIndex = arr.length, res = [];
    for(let i=arr.length-1; i>=0; i--){
         //遇到*,push*后数组,然后push*
        if(arr[i] === '*'){
            res.push(...arr.slice(i+1, lastIndex), '*')
            lastIndex = i;
        }
    }
    // 如果第一位不是*,需要把0,lastIndex的非*放入
    if(arr[0]!=='*'){
        res.push(...arr.slice(0, lastIndex))
    }
    return res;
}

题目升级,连续字母一组,连续非字母一组,然后分组排序。

function reverseArr(arr){
    // flag true表示当前匹配到了非字母块
    let lastIndex = arr.length,flag = false,  res = [];
    for(let i=arr.length-1;i>=0; i--){
        // 当前非字母且flag false的话,添加非字母后的字母到lastIndex数组解析,并把flag设置为true
        if(!/[a-zA-Z]/g.test(arr[i])){
            if(!flag){
                 res.push(...arr.slice(i+1, lastIndex))
                 lastIndex = i;
            } 
             flag = true
        }
        // 当前字母且flag true的话,添加字母后的非字母到lastIndex+1的数组解析,并把flag设置为false
        else {
            if(flag){
                res.push(...arr.slice(i+1, lastIndex+1)) 
                lastIndex = i+1;
            }    
            flag = false
        }
    }
    // 处理头部的全字母或者全非字母
    if(!flag){
         res.push(...arr.slice(0, lastIndex))
    }else {
        res.push(...arr.slice(0, lastIndex+1)) 
    }
    
    return res;
}

坐等大佬指导 更好的解决方法~~~~

4. 字节--接雨水

暴力法  Math.Max(r_max,l_max) - height[i]   o(n^2), o(1)

O(n),O(n)

 双指针

0-1背包

 

 

持续更新中...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值