腾讯提前批笔试题2–魔法序列
题目描述
小Q拥有一个只存储了整数的序列叫做魔法序列。一开始序列为空,小Q会执行以下两种操作:
- add(x):表示往系列中添加一个值为x的整数。(add数组表示每次往数组中添加的数字)
- 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小的数字。