面试题记录 JS相关 小白篇

224 阅读5分钟

人生苦短,总要写点东西留下足迹。

求素数

写一个函数,要求参数是一个1000000以内的整数,并判断这个整数是不是素数。注意代码执行效率不超过32ms

答:这题应该不算难,大家在学校里经常写吧。

function prime(a) {
      console.time("运行时间");
      let isPrime = true;
      let b = Math.pow(a, 0.5);
      for (let index = 2; index <= b; index++) {
        if (a % index === 0) {
          isPrime = false;
          console.log("是素数");
          console.timeEnd("运行时间");
          return null;
        }
      }
      if (isPrime) {
        console.log("是素数");
      }
      console.timeEnd("运行时间");
    }
    prime(987631);

问:这个循环多少次? 答:不超过1000次

问:怎么让循环次数不少于500次? 答:踢出去偶数,代码如下

   function prime(a) {
      console.time("运行时间");
      if (a === 2) {
        console.log("是素数");
        console.timeEnd("运行时间");
        return null;
      }

      let isPrime = true;
      let b = Math.pow(a, 0.5);

      for (let index = 3; index <= b; index += 2) {
        if (a % index === 0) {
          isPrime = false;
          console.log("不是素数");
          console.timeEnd("运行时间");
          return null;
        }
      }
      if (isPrime) {
        console.log("是素数");
        console.timeEnd("运行时间");
      }
    }
    prime(999983);

求交集

有两个数组:let arr1 = [1,2,3,4,5] , arr2 = [3,5,7,8,9]。使用一行代码实现:得到一个新的数组,里面只包含两个数组都有的元素。

答:[...new Set([...a, ...b])]

问:貌似有些不对,这好像是并集......

答:let arr = arr1.filter((a) => arr2.find((b) => b === a));在arr1里过滤出arr1与arr2共有的元素。

问:看似没得问题。 arr1 arr2 都含有0 会怎样?

答:求出来的交集没有0,原因,find返回的是元素的值。find 0 的时候,filter返回值0,是false。难不倒我。

arr1.filter((a) => arr2.find((b) => b === a) === undefined ? false : true);

确实ok了,但感觉怪怪的。看最终版吧。 arr1.filter(a => arr2.includes(a));

是时候复习功课了,红红火火恍恍惚惚哈哈哈哈哈哈。

找只出现一次的元素

有数组 let arr = [1,2,1,3,1,2,2,2,4];要求:得到一个新数组,里面只包含在arr中只出现一次的元素,比如:[3,4]。只允许一行。

答:思考半天,整出来下面这个

arr.filter(
        (item) =>
          !arr.reduce((count, cur) => {
            return (count = item === cur ? count + 1 : count);
          }, -1)
      )

还有下面这个

arr.filter(
        (item, item_index) =>
          !arr.find((a, a_index) => a === item && a_index !== item_index)
      )

问:整的太复杂了,给提示:下面这三个怎么写。数组里偶数的集合? 数组里偶数的个数? 数组里偶数个数是否大于3?

答:这我会呀!可这个跟这个题怎么联系啊?这怎么写? 统计元素次数就得另外来一个数组,再统计,一行搞不定呀。。。

    console.log(arr.filter((item) => item % 2 === 0));
    console.log(arr.filter((item) => item % 2 === 0).length);
    console.log(arr.filter((item) => item % 2 === 0).length > 3);

哦!这样!两个filter加一起。

arr.filter((a) => arr.filter((item) => item === a).length === 1)

统计次数转成对象

统计上题数组arr中每种数字出现的次数。结果示例:{ "1":2,"2":4 ,"3":1,"4":1}。

答:简单,前两天刚写过

arr.forEach((item) => (o[item] = o.hasOwnProperty(item) ? o[item] + 1 : 1));

问:用reduce怎么写? ||运算符怎么用?

答:想一哈,有了!

    let o = {};
    arr.reduce((pre, cur) => {
      o[cur] || (o[cur] = pre);
      o[cur]++;
      return pre;
    }, 0);

问:为什么不把reduce第二个参数整成{}

答:我又可以了

 console.log(
      arr.reduce((o, cur) => {
        o[cur] || (o[cur] = 0);
        o[cur]++;
        return o;
      }, {})
    );

问:化简到一行怎么整?o[cur]=...? 逗号运算符了解吗?

答:

    console.log(
      arr.reduce((o, cur) => {
        o[cur] = (o[cur] || 0) + 1;
        return o;
      }, {})
    );
    console.log(arr.reduce((o, cur) => ((o[cur] = (o[cur] || 0) + 1), o), {}));
    //JS真的是一门奇妙的语言啊

奔跑吧,兔子!

在一个神话故事中,有一只小兔子住在一个周长1千米的神湖旁,A、B两点把这个神湖分成两等份(如图).已知小兔子从B点出发,沿着逆时针方向绕神湖做跳跃运动,它每跳 3 8 千米休息一次,如果它跳到A点正好休息,那么就会经过特别通道AB滑到B点,从B点继续跳.它每经过一次特别通道,神湖的半径就扩大一倍.现在已知小兔子共休息了1000次,这时神湖的周长是多少千米?

答:哈哈哈哈,数学题,参考答案mofangge.xin,直接写答案了,分析过程就瞎整了。

    let step = 375;
    let place = 0;
    let p = 1000;
    // 半径 穿越
    for (let i = 1; i <= 1000; i++) {
      let isPass = false;
      place += step;

      if (place % p === p / 2) {
        place = 0;
        p = 2 * p;
        isPass = true;
      }
      console.log(place, p, isPass);
    }

总结

在学校里遇见的题目确实需要逻辑哈。完结。