SOURCE

//  题目一:找出数组中出现次数超过一半的数字JavaScript

/* --------- 找出数组中出现次数超过一半的数字 --------- */
/* 尽量不使用 JS 特有的语法糖,尽量不使用如 Array.sort 等语言特有的方法。*/

/**
 * @param {number[]} arr - 元素内容全部为自然数的数组
 * @return {number} - 返回数组中出现次数超过数组长度一半的自然数,如果没有则返回 -1 
 */
function findMoreThanHalf(arr) {
    // your code are here...
}

// 测试用例
// console.log(findMoreThanHalf([0,1,2,2])) // -1
// console.log(findMoreThanHalf([0,1,2,2,2])) // 2
  
// 题目一的实现代码写这里
function findMoreThanHalf(arr) {
    let mapObj = {};
    for(let i = 0; i < arr.length; i++) {
        mapObj[arr[i]] ? mapObj[arr[i]] += 1 : mapObj[arr[i]] = 1;
    }
    for(let [key, value] of Object.entries(mapObj)) {
        if(value > parseInt(arr.length / 2)) {
            return Number(key);
        }
    }
    return -1;
}

// console.log(findMoreThanHalf([0,1,2,2]))
// console.log(findMoreThanHalf([0,1,2,2,2]))

  
  
// 题目二:找出最接近的值
  
/* --------- 找出最接近的值 ----------- */
/* 尽量不使用 JS 特有的语法糖,尽量不使用如 Array.sort 等语言特有的方法。*/
// const arr2 = [1, 5, 9, 15, 28, 33, 55, 78, 99];

/**
 * 返回最接近输入值的数字,如果有多个,返回最大的那个
 * @param {number} n
 * @return {number}
 */
function findNext(n, arr) {
  // your code are here...
}

// console.log(findNext(44, arr2)); // should print 55


// 题目二的实现代码写这里


function findNext(n, arr) {
    let index = 0;
    let maxDiff = Number.MAX_VALUE;
    for(let i = 0; i < arr.length; i++) {
        let newDiff = Math.abs(arr[i] - n);
        if(newDiff <= maxDiff) {
            if((newDiff === maxDiff) && (arr[i] < arr[index])) {
                continue;
            }
            index = i;
            maxDiff = newDiff;
        }
    }
    return arr[index];
}

const arr2 = [1, 5, 9, 15, 28, 33, 55, 78, 99];
// console.log(findNext(44, arr2));





// 题目三:深拷贝

// 入参格式参考:
const originObj = {
  a: {
    b: {
      c: [1, 5, 11, 23, 422]
    }
  },
  d: function() {
    // console.log('hello world');
  }
};

/*实现一个函数,可以深拷贝一个对象,对象可能包含 function*/
// function clone(originObj) {
//   /**
//    * 此处写代码逻辑
//    */
// }

// 题目三的实现代码写这里


const isComplexDataType = obj => (typeof obj === 'object' || typeof obj === 'function') && (obj !== null)

const clone = function (obj, hash = new WeakMap()) {
     //日期对象就返回一个新的日期对象
    if (obj.constructor === Date) {
        return new Date(obj);
    }
    //正则对象就返回一个新的正则对象
    if (obj.constructor === RegExp) {
        return new RegExp(obj);
    }
    // 基本类型直接返回  
    if(originObj === null || typeof originObj !== 'object') {
        return originObj;
    } 

    // 循环引用问题
    if (hash.has(obj)){
        return hash.get(obj)
    }
    //遍历传入参数所有键的特性
    let allDesc = Object.getOwnPropertyDescriptors(obj);
    //继承原型链     
    let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc);

    hash.set(obj, cloneObj)
    //Reflect.ownKeys(obj)可以拷贝不可枚举属性和符号类型
    for (let key of Reflect.ownKeys(obj)) {
        // 如果值是引用类型(非函数)则递归调用deepClone
        cloneObj[key] = (isComplexDataType(obj[key]) && typeof obj[key] !== 'function') 
                ?   clone(obj[key], hash) 
                :   obj[key];
    }
    
    return cloneObj;
};
console 命令行工具 X clear

                    
>
console