腾讯提前批笔试题-2-魔法序列

腾讯提前批笔试题2–魔法序列

题目描述

  小Q拥有一个只存储了整数的序列叫做魔法序列。一开始序列为空,小Q会执行以下两种操作:

  1. add(x):表示往系列中添加一个值为x的整数。(add数组表示每次往数组中添加的数字)
  2. get(y):表示在第y次add操作后,取出序列中第k小的数,并将其输出。其中k初始时候为1,每执行一次get操作之后,k的值会+1。(get数组中第i个数表示在执行了get(i)次add操作后,执行一次get操作)

解决方案

const add = [3, 1, -4, 2, 8, -1000, 2];
const get = [1, 2, 6, 6];

const main = (input, output) => {
    const temp = [];
    const result = [];
    let k = 1;
    let j = 0;
    for(let i = 0; i < input.length; i++){
        let index = helper(input[i], temp);
        temp.splice(index, 0, input[i]);
        while((output[j] - 1) === i){
            result.push(temp[k - 1]);
            j++;
            k++;
        }
    }
    console.log(result);
};
const helper = (a, array) => {
    if(array.length === 0) return 0;
    let start = 0;
    let end = array.length;
    if(a > array[end - 1]) return end;
    if(a < array[0]) return start;
    while(start <= end){
        let mid = parseInt((start + end) / 2);
        if(a === array[mid]) return  mid;
        else if(a > array[mid]) start = mid + 1;
        else if(a < array[mid]) end = mid -1;
    }
    return start;
};
main(add, get);

题目解析:

  答题当时的思路非常差,企图在每次get()执行时进行sort()排序,这是一个非常馊的主意,强行增加复杂度。当前思路是add()执行的时候一直维护一个有序的数组,通过二分查找,找到插入数据的位置,方便在get()时选择第k小的数字。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值