阿里web前端面试-笔试题

发布于:2024-06-30 ⋅ 阅读:(13) ⋅ 点赞:(0)

面试中遇到的笔试题,记录一下~

题目:

1.写一个方法,统计字符串中出现的字母及出现次数。

比如:入参abcAAAabc

返回:a:2,b:2,c:2,A:3(示形式不限,但是结果中要能清晰感知出现字母及出现的次数)

const str = 'abcAAAabc';
let countObj = {}; // 用来统计字符串中出现的字母及次数

// 循环字符串
for (let i = 0; i < str.length; i++) {
    // 将字符串中出现的字母设置为countObj的key名
    let key = str[i];

    // 将字符串中出现的字符(即字母)和字符出现次数存入countObj中
    if (countObj[key]) {
        countObj[key]++;
    } else {
        countObj[key] = 1;
    }
}
console.log('countObj:', countObj); // countObj:{a: 2, b: 2, c: 2, A: 3}

// 输出统计的字母及出现次数
for (const key in countObj) {
    console.log(`字母${key}-出现${countObj[key]}次`);
}

2./**

     * 说明:计算多个区间的交集。

     *      区间应长度为2的数组数组表示,如[2, 5]表示区间2到5(包括2到5);

     *      区间不限定方向,如[5, 2]等同与[2, 5];

     *      实现`getIntersection`,可接收多个区间,并返回所有区间的交集(用区间表示),如空集用null表示

     * 示例:

     *  getIntersection([5, 2], [4, 9], [3, 6]); // [4, 5]

     *  getIntersection([1, 7], [8, 9]); // null

     */

    function getIntersection(...args) { // 剩余运算符 [[5, 2], [4, 9], [3, 6]]
      let fArr = []; // 存储所有输入数组的第一位数字,输出新的数组
      let lArr = []; // 存储所有输入数组的第二位数字,输出新的数组
      // 遍历输入数组
      for(let item of args) {
        item.sort((a,b)=>{ return a-b }) // 将输入数组排序,数组第一个数小于数组第二个数
        fArr.push(item[0]) // 将第一个下标放到数组fArr中
        lArr.push(item[1]) // 将第二个下标放到数组lArr中
      }
      console.log('fArr:', fArr); // [2, 4, 3]
      console.log('lArr:', lArr); // [5, 9, 6]
     
      let fMax = Math.max(...fArr); // 选出第一个下标比较大的值
      let lMin = Math.min(...lArr); // 选出第二个下标比较小的值
      console.log('fMax:', fMax); // 4
      console.log('lMin:', lMin); // 5
      
      if(fMax > lMin) {  // 如果第一个数字大于第二个数字,无交集
        return null;
      } else if(fMax === lMin) { // 如果第一个数字等于第二个数字,交集为当前值
        return fMax;
      } else {
        return [fMax,lMin]; // 有交集情况
      }
      
    }
    console.log(getIntersection([5, 2], [4, 9], [3, 6])); // [4, 5]