2020哔哩哔哩校招前端笔试编程题

具体题目要求可参照 题目及测试

1. 找出有序数组(从小到大排列)中和为sum的两个数,要求复杂度为O(n),找到一组即可

const readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})
// 找出有序数组(从小到大排列)中和为sum的两个数,要求复杂度为O(n),找到一组即可
/* 
  数组长度 5
  数组 1 3 4 6 8
  sum 10

  用二分查找:
    1. 输入的数组input = ['5', '1 3 4 6 8', '10']
    2. 对于数组 [1, 3, 4, 6, 8],头部是 i, 尾部是 j
    3. 第1次先让 arr[i] + arr[j] ==> 1 + 8 = 9 ==> 9 < 10 ==> i++  
    4. 第2次让 arr[i] + arr[j] ==> 3 + 8 = 11 ==> 11 > 10 ==> j--  
    5. 第3次让 arr[i] + arr[j] ==> 3 + 6 = 9 ==> 9 < 10 ==> i++  
    6. 第4次让 arr[i] + arr[j] ==> 4 + 6 = 10 ==> 10 = 10 ==> 4 6 
*/
const input = [] // 输入所有行的数组
const maxLine = 3 // 输入3行
function solution(input) {
  // 对input进行处理,拿到数组 arr = [1, 3, 4, 6, 8]
  const arr = input[1].split(' ').map(item => parseInt(item))
  // 定义头部指针 i,尾部指针 j
  let i = 0
  let j = arr.length - 1  // 或者是  let j = parseInt(input[0])
  // 找到输入的 sum 
  const sum = parseInt(input[2]) // 10
  // 二分查找开始
  while (i < j) {
    let res = arr[i] + arr[j]
    // 找到了
    if (res === sum) {
      return `${arr[i]} ${arr[j]}`
    }
    // 当 arr[i] + arr[j] > sum 时 , j--
    if (res > sum) {
      j--
    }
    // 当 arr[i] + arr[j] < sum 时 , i++
    if (res < sum) {
      i++
    }
  }
  return 'notfonu' 
}
// 出=处理多行输入
rl.on('line',(line) => {
  input.push(line);
  if (input.length === maxLine) {
    console.log(solution(input))
    rl.close()
  }
})

2.有n级台阶,每一步可以走1级或2级,问一共有多少种走法

const readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

function solution(step) {
  step = parseInt(step)
  function walk(n) {  // n为第几节台阶
    if (n === 1) return 1
    if (n === 2) return 2
    if (n === 0) return 0
    return walk(n-1) + walk(n-2)
  }
  return walk(step)
}

rl.on('line',(line) => {
  console.log(solution(line))
})
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值