9.17 滴滴前端笔试

题型:1.5h、选择题X20 + 编程X2

选择题:

考得有点杂,有数据库、Linux的东西,但是基础的html、css、js考察得比较简单。记几个印象比较深的吧!
  1. <img><table>哪个是语义化标签 —— table不是语义化标签
  2. jQuery里选择this的方法是 —— $(this),误导选项有$('this')
  3. 哪些排序算法是交换算法—— 冒泡排序和快速排序

编程题:

  1. 两道模拟题,思路很容易想到,但编程费点事情。供参考,不保证能AK
  2. 对于多个条件判断的情况要及时检验,如第2题,即写好一个就打印看看,有问题就及时解决,不然太乱了,都不知道问题出在哪里了
  3. 要多练习,不然光有思路也做不出来,第2题踩了一个坑,怎么判断都不对,如下面arr[index + 1] !== 1那里没考虑到,数组中的数据是字符串,即是‘1’,而不是1。所以要么提前把字符串转为数字,要么用“==”判断
    // 处理头部的问号
     if(item === '?' && index === 0) {
       if(arr[index + 1] == undefined || arr[index + 1] !== 1) {
           tempArr.push(1);
        } else if (arr[index + 1] === 1) {
           tempArr.push(2);
         }
     }

一、破译密码

发送方会对密码做如下加密,如欲发送y,会将y的二进制数中1的个数记为x,将加密后的数y*x发送出去,接收方拿到数据z后,进行解密,返回可能的原数据y。如接收到54054,解密后可能结果为[9009, 7722, 6006]。输出结果的个数和按的顺序的字符串即输出 3 6006 9009 7722
思路:
  • 逆向暴力求解,即记原数据所乘的个数x为i,通过for循环i,得到原数据y,再去验证y变成二进制数据后1的个数是否为i,相等即可行。思路很简单,但是有一个问题,for循环i的范围是多少,我想的是慢慢试,比如1-50、不能AC就1-100…… 但是怎么试都只通过9%,后来才发现题目里要求结果按从小到大输出,吐血! 下面就默认i的范围是1-50
  • 那么能不能确定下i的范围呢?还是希望这个范围能尽量小的。假如设原数据转二进制后1的个数为x,那么原数据最小为2^x-1即接收的值z >= x*(2^x-1),这个应该能得到x的范围,或者有没有其他方法?
function getRes(num) {
  let res = [];
  for(let i = 1; i < 11; ++i) {
    if(num % i === 0 && judgeI(num, i)) {
      res.push(num/i)
    }
  }
  console.log(res.length);
  console.log(res.sort().join(' '));

}

function judgeI(num, i) {
  let origin = num/i, count = 0
  // 将原来的数转成二进制
  let arr = [...origin.toString(2)];
  arr.map(i => {if(i == '1'){count++}})
  return count == i? true:false;
}
getRes(54054); // 3    6006 7722 9009

二、恢复被墨水污染的实验数据

即一串非负正整数数字,其中部分位数被墨水污染了记为‘?’,但是该数据符合以下的规则。要求将数据恢复,并使得数据最小。例如输入'?12?0?9??',输出'212101902'。
  1. 首位不能是0;
  2. 相邻数字不相同
  3. 这个数可以被3整除
思路:
  1. 用map遍历原字符串数组,遇到‘?’就看看给个最合适的且最小的值,记住最后一个"?"除了不能和两边的相同,而且还要保证该数可以被3整除。为啥要最后一个保3呢?因为要求数据最小,所以高位数据尽量小,最后一位在“保3”的基础上尽量小!
  2. 一个数能被3整除的充要条件是它各位之和也要能被3整除
  3. 下面函数的输入已经将字符变为数组了
    function getRes(arr) {
      // 最后一个的序号要用它“保三”
      let lastIndex = arr.lastIndexOf("?");
      let tempArr = [];
      arr.map((item, index) => {
          // 处理头部的问号
          if(item === '?' && index === 0) {
            if(arr[index + 1] == undefined || arr[index + 1] != 1) {
              arr[index] = 1;
            } else if (arr[index + 1] == 1) {
              arr[index] = 2;
            }
          } else if(item === '?' && index < lastIndex) {
            // 处理中间的'?'
            for(let i = 0; i <= 9; ++i) {
              if(arr[index - 1] != i && arr[index + 1] != i) {
                arr[index] = i;
                // 找到一个就跳出
                break;
              }
            }
          } else if (index === lastIndex) {
            // 处理最后的问号,要复杂一点
            // 先求出除最后一个"?"外所有的值和
            let sum = 0;
            arr.forEach((element) => {
              if (element !== "?") sum += parseInt(element);
            });
    
            for (let i = 0; i <= 9; ++i) {
              if (
                arr[index - 1] != i &&
                (arr[index + 1] == null || arr[index + 1] != i)
              ) {
                  console.log(sum);
                // 看能不能'保三'
                if ((sum + i) % 3 === 0) {
                  arr[index] = i;
                   // 找到一个就跳出循环
                  break;
                }
              }
            }
          }
        }
      )
      return arr.join("");
    }
    
    console.log(getRes(["?", "1", "2", "?", "0", "?", "9", "?", "?"]));








#滴滴##滴滴笔试##前端#
全部评论
第一题,题目是设y=xf(x),其中f(x)为x转为二进制后的1个数。输入为y,求满足函数的x个数。我求法是先求出y所需的二进制表示位数n(也就是x的最大值),然后for循环遍历i=1~n,反求出x,并计算x中包含1的个数m,判断i是否等于m,如果判断成立则满足条件。但是只A了73%,不知道哪里还有问题。抛砖引玉。
1 回复
分享
发布于 2022-09-18 14:10 江苏
https://www.whyknown.com/ ===> 如何精通面试,获取前端面试资源,吊打大厂面试官,通过面试题查缺补漏,秋招、社招一战成名。免费开源前端|面试进阶之道,快来学习,会更新各大厂的面试真经和答案,每个面试题从源码角度和可调试、尝试角度出发,祝你成功!===> https://www.whyknown.com/
点赞 回复
分享
发布于 2022-09-18 15:12 北京
滴滴
校招火热招聘中
官网直投
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞 回复
分享
发布于 2022-09-19 12:37 北京

相关推荐

3 8 评论
分享
牛客网
牛客企业服务