// 题目一:找出数组中出现次数超过一半的数字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