2020.3.8 Vivo笔试

第一次发帖,紧张

使用语言JavaScript
1、相当于计算数列 1,2,2,3,3,3,4,4,4,4,5……前n项的和
function solution(n) {
  const x = Math.floor(Math.sqrt(1 + 8 * n) / 2 - 0.5);
  const remain = n - ((1 + x) * x) / 2;
  let result = 0;
  for (let i = 1; i <= x; i++) {
    result += i ** 2;
  }
  result += remain * (x + 1);
  return result;
}
2、找出每位乘积为n的最小数,如36=>49(4*9=36),2=>12(1*2=2)
function solution(n) {
  let result = '';
  let tmp = n;
  for (let i = 9; i > 1; i--) {
    while (!(tmp % i)) {
      tmp /= i;
      result = i + result;
    }
  }
  while (tmp === 1 && result.length < 2) {
    result = 1 + result;
  }
  if (tmp !== 1) {
    return -1;
  } else {
    return parseInt(result);
  }
} 
3、给定最大长度n和最小长度m,求锁屏图案密码的总数。其实就是找有多少个长度在m到n之间的符合规则的点序列。
/*  1 2 3
   4 5 6
   7 8 9
*/
function isCorrect(path, point) {
  const lines = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [1, 4, 7],
    [2, 5, 8],
    [3, 6, 9],
    [1, 5, 9],
    [3, 5, 7]
  ];
  if (path.length === 0) {
    return true;
  }
  if (path.indexOf(point) !== -1) {
    return false;
  }
  let point1 = path[path.length - 1];
  let point2 = point;
  if (point2 < point1) {
    [point1, point2] = [point2, point1];
  }
  for (let line of lines) {
    if (
      point1 === line[0] &&
      point2 === line[2] &&
      path.indexOf(line[1]) === -1
    ) {
      return false;
    }
  }
  return true;
}

function solution(m, n) {
  let count = 0;
  function solve(path, remain) {
    if (remain <= max - min) {
      count++;
    }
    if (remain === 0) {
      return;
    }
    for (let i = 1; i <= 9; i++) {
      if (isCorrect(path, i)) {
        path.push(i);
        solve(path, remain - 1);
        path.pop();
      }
    }
  }
  const min = Math.max(1, m);
  const max = Math.min(9, n);
  let path = [];
  solve(path, max);
  return count;
}
不过上面能过的话下面的解也能过(而且肯定快,不过你要把每一项先算出来emmm)
function solution(m, n) {
  const result = [9, 56, 320, 1624, 7152, 26016, 72912, 140704, 140704];
  const min = Math.max(1, m);
  const max = Math.min(9, n);
  return result.slice(min - 1, max).reduce((pre, cur) => pre + cur, 0);
}

算法能力垃圾,仅供参考。
#vivo##笔试题目#
全部评论
平方和是由公式的,第一题按照你的做法都不需要for循环了。。
1 回复
分享
发布于 2020-03-08 19:06
大佬问一下,写成const x = (int)((Math.sqrt(1 + 8*n)-1)/2) 有什么问题么 ac不了
1 回复
分享
发布于 2020-03-08 20:31
小红书
校招火热招聘中
官网直投
第一题是不n * (n + 1) * (2n + 1) / 6 ?
1 回复
分享
发布于 2020-03-08 21:04
tql
点赞 回复
分享
发布于 2020-03-08 17:14
tql
点赞 回复
分享
发布于 2020-03-08 17:24
想了解一下第一题的解题思路,我是直接模拟的数组两层循环求的解。我的代码如下 是进行了数学推导吗?能否分享一下公式
点赞 回复
分享
发布于 2020-03-08 17:38
你这也太强了 我写的时候就在想 这第三道题肯定不会有人写出来的
点赞 回复
分享
发布于 2020-03-08 18:28
tql
点赞 回复
分享
发布于 2020-03-08 18:50
第二题当n=81的时候,最小值应该是99,程序好像得不到吧
点赞 回复
分享
发布于 2020-03-08 19:08
为什么我只有一道编程题,前面还有单选,多选,填空
点赞 回复
分享
发布于 2020-03-11 11:33

相关推荐

头像
不愿透露姓名的神秘牛友
03-13 10:56
点赞 评论 收藏
转发
6 10 评论
分享
牛客网
牛客企业服务