// 面试过程遇到的算法题
// 字节跳动一面---start
// 1、实现一个compose 函数
// 特点:
// compose的参数是函数,返回的也是一个函数
// 因为除了第一个函数的接受参数,其他函数的接受参数都是上一个函数的返回值,所以初始函数的参数是多元的,而其他函数的接受值是一元的
// compsoe函数可以接受任意的参数,所有的参数都是函数,且执行方向是自右向左的,初始函数一定放到参数的最右面
// let compose = function(...args) {
// let len = args.length;
// // console.log(len);
// let count = len - 1;
// let result;
// return function f1(...args1) {
// result = args[count].apply(this, args1);
// if(count <= 0) {
// count = len - 1;
// return result;
// }
// else {
// count--;
// return f1.call(null, result);
// }
// }
// }
// const b = (x, y) => x + y;
// const a = x => x * x;
// const c = compose(a, b);
// let result = c(1, 2);
// console.log(result);
// 2、实现sleep(2000).then(() => {
//do something
// })
// function sleep(ms) {
// return new Promise((resolve, reject) => {
// setTimeout(resolve, ms, 'done');
// })
// }
// sleep(2000).then((res) => {
// console.log(res);
// })
// 字节跳动一面---end
// 3、两个大数相加
// function sum(str1, str2) {
// const arr1 = str1.split(''),arr2 = str2.split('');
// const len1 = arr1.length,len2 = arr2.length;
// const maxLen = Math.max(len1, len2);
// let res = [];
// let flag = false;
// for(let i = 0; i < maxLen; i++) {
// let temp;
// let num1 = arr1.pop() , num2 = arr2.pop();
// num1 = num1 ? num1 : 0;
// num2 = num2 ? num2 : 0;
// if(flag) {
// temp = parseInt(num1) + parseInt(num2) + 1;
// } else {
// temp = parseInt(num1) + parseInt(num2);
// }
// if(parseInt(temp/10) > 0) {
// // 有进位
// res.push(temp%10);
// flag = true;
// } else {
// res.push(temp);
// flag = false;
// }
// if( i == maxLen -1 && flag) {
// res.push(1);
// }
// }
// return res.reverse().join('');
// }
// // 验证
// let result = sum('987654321111234','99900334444') // '987754221445678'
// console.log(result)
// 4、在排序数组中查找元素的第一个和最后一个位置
// var searchRange = function (nums, target) {
// const findLeft = (nums, target) => {
// let left = 0;
// let right = nums.length - 1;
// while (left <= right) {
// let mid = Math.floor((left + right) / 2);
// if (nums[mid] >= target) {
// right = mid - 1;
// } else {
// left = mid + 1;
// }
// }
// return left;
// }
// if (nums[findLeft(nums, target)] !== target)
// return [-1, -1]
// else
// return [findLeft(nums, target), findLeft(nums, target + 1) - 1]
// };
// const nums = [1, 2, 5, 6, 6, 6, 7, 9];
// const target = 2;
// console.log(searchRange(nums, target));
// 5、广度优先遍历
// const data = {
// name: 'root',
// children: [
// {
// name: 'child_0',
// children: [
// {
// name: 'child_0_0',
// children: [],
// },
// ],
// },
// {
// name: 'child_1',
// children: [
// {
// name: 'child_1_0',
// children: [],
// },
// ],
// },
// ],
// };
// function f(data) {
// const res = [];
// let queue = data.children;
// res.push(data.name);
// while (queue.length) {
// [...queue].forEach(child => {
// res.push(child.name);
// queue.shift();
// child.children && queue.push(...child.children);
// });
// }
// return res;
// }
// console.log(f(data));
// 6、在未排序的数组中找到第k大的元素
// const sort = (arr, k) => {
// let max = arr[0];
// for (let i = 0; i < k; i++) {
// for (let j = 0; j < arr.length - i - 1; j++) {
// if (arr[j] > arr[j + 1]) {
// max = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = max;
// }
// }
// }
// return arr[arr.length - k];
// };
// let arr = [3,2,1,5,6,4], k = 2;
// console.log(sort(arr, k));
// 7、输入一个正整数n,输出所有和为n连续正数序列
// (例如:15输出 [ [1,2,3,4,5 ] , [ 4,5,6 ] , [ 7,8 ] ] )
// function get_value(value) {
// let num = value
// let arr = []
// let newnum = 0
// if (num % 2 == 1) {
// arr.push([(num - 1) / 2, (num + 1) / 2])
// newnum = num + 1
// }
// let arr1 = []
// for (let i = 1; i < newnum / 2; i++) {
// arr1 = []
// for (let i1 = i; i1 < newnum / 2; i1++) {
// arr1.push(i1)
// let sum = 0
// for (let i2 = 0; i2 < arr1.length; i2++) {
// sum += Number(arr1[i2])
// if (sum == num) {
// arr.push(arr1)
// i1 = newnum / 2
// } else if (sum > num) {
// i1 = newnum / 2
// } else {
// }
// }
// }
// }
// console.log(arr)
// }
// get_value(15)
console