牛客高频Top200(1)

  • Post author:
  • Post category:其他




NC78反转链表

pre为上一个节点,cur为当前遍历节点,next用来保存下一个节点,每次遍历,先保存下一个节点,让当前节点cur指向它的前一个节点pre,pre和cur同时后移。遍历到最后,cur指向null,pre指向最后一个节点,直接返回pre即可。

function ReverseList(pHead)
{
    let pre = null;
    let cur = pHead;
    let next;
    while(cur){
        next = cur.next;  //保存下一个节点
        cur.next = pre;  //当前指向前一个
        pre = cur;  //pre后移
        cur = next;  //cur后移
    }
    return pre;
}
module.exports = {
    ReverseList : ReverseList
};



NC140排序

由于要求时间复杂度在nlogn,所以写了一个快排。

function MySort( arr ) {
    if( !arr || arr.length < 2) return arr;
    quickSort( arr , 0 , arr.length - 1);
    return arr;
}
function quickSort( arr , l , r){
    if( l > r) return;
    let i = l;
    let j = r;
    let flag = arr[l];
    while( i < j){
        
        while( arr[j] >= flag && i < j){
            j--;
        }
        
        while( arr[i] <= flag && i < j){
            i++;
        }
        
        let temp;
        if(i < j){
            temp  = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    arr[l] = arr[i];
    arr[i] = flag;
    quickSort( arr , l , i - 1);
    quickSort( arr , i + 1 , r)
}
module.exports = {
    MySort : MySort
};



NC93设计LRU缓存结构

这里的key和value一一对应,js里有map数据结构,并且访问时的顺序正是按照set的顺序来。所以我们每次get时,不在map里返回-1到数组answer,若在map里,将结果返回到answer然后delete再重新添加,这样它就在map的前面,当set时发现数量超过k,就删除第一个访问到的,这也是相对于在map结构里最早添加且最近没有被访问的。

function LRU( operators ,  k ) {
    let answer = new Array();
    let map = new Map();
    for( let item of operators ){
        if(item[0] == 1){//set
            if(map.get(item[1])){//原来有 先删除 再添加
                map.delete(item[1]);
                map.set(item[1],item[2]);
            }else{
                map.set(item[1],item[2]);
            }
            if(map.size > k){
                for(let v of map.keys()){
                    map.delete(v);
                    break;
                }
            }
        }else if(item[0] == 2){//get
            let val = map.get( item[1] );
            if(!val){//没找到
                answer.push(-1);
            }else{
                answer.push(val);
                map.delete(item[1]);
                map.set(item[1],val);
            }
        }
    }
    return answer;
}
module.exports = {
    LRU : LRU
};



NC45实现二叉树先中后遍历

递归遍历。

function threeOrders( root ) {
    let arr1 = [];
    let arr2 = [];
    let arr3 = [];
    if(root != null){
        xian(root , arr1);
        zhong(root , arr2);
        hou(root , arr3);
    }
    return [ arr1 , arr2 , arr3 ]
}
function xian(node , arr1){
    arr1.push(node.val);
    if(node.left != null) xian(node.left , arr1);
    if(node.right != null) xian(node.right , arr1);
}
function zhong(node , arr2){
    if(node.left != null) zhong(node.left , arr2);
    arr2.push(node.val);
    if(node.right != null) zhong(node.right , arr2);
}
function hou(node , arr3){
    if(node.left != null) hou(node.left , arr3);
    if(node.right != null) hou(node.right , arr3);
    arr3.push(node.val);
}
module.exports = {
    threeOrders : threeOrders
};



NC119最小的k个数

先快排,然后使用slice方法返回[0,k)个数。

function GetLeastNumbers_Solution(input, k)
{
    quickSort(input , 0 , input.length - 1);
    return input.slice(0,k);
}
function quickSort(input , l , r){
    if( l > r) return ;
    let i = l ;
    let j = r;
    let flag = input[l];
    while(i < j){
        
        while( input[j] >= flag && i < j){
            j--;
        }
        while( input[i] <= flag && i < j){
            i++;
        }
        let temp;
        if( i < j){
            temp = input[i];
            input[i] = input[j];
            input[j] = temp;
        }
    }
    input[l] = input[i];
    input[i] = flag;
    quickSort(input , l , i - 1);
    quickSort(input , i + 1 , r);
}
module.exports = {
    GetLeastNumbers_Solution : GetLeastNumbers_Solution
};



NC15二叉树层序遍历

使用队列层次遍历,只是在每次访问时需要将当前层的节点元素放入同一个数组,记得添加到数组中的是节点的val。

function levelOrder( root ) {
    let ans = [];
    let queue = [root];
    if(root == null) return [];
    while(queue.length != 0){//当队列不为空时
        let each = [];
        let queueLength = queue.length;
        while(queueLength != 0){
            let x = queue.shift();
            each.push(x.val);
            if(x.left != null ) queue.push(x.left);
            if(x.right != null ) queue.push(x.right);
            queueLength--;
        }
        console.log(each)
        ans.push(each);
    }
    return ans;
}
module.exports = {
    levelOrder : levelOrder
};



版权声明:本文为pingting_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。