如何实现数组最近Fibonacci数计算以得到预期输出2
代码修改实现方案
需求对齐
传入数组[15, 1, 3]时,首先计算数组有效元素总和为19,再找到距离19最近的斐波那契数(该值为21),最终输出两者的绝对差值2。
原有代码问题
- 原代码逻辑为统计数组内本身是斐波那契数的元素个数,和当前需求完全不匹配
- 原驱动代码中数组写法存在多余逗号,生成了空元素
[15, 1, ,3],遍历过程会出现undefined值,需要修正语法错误
修改后完整代码
// 原有判断完全平方数的工具函数可直接复用 function isPerfectSquare(num) { let n = parseInt(Math.sqrt(num)); return n * n === num; } // 复用原有逻辑封装斐波那契数判断方法 function isFibonacci(num) { return isPerfectSquare(5 * num * num + 4) || isPerfectSquare(5 * num * num - 4); } // 核心业务逻辑 function calcNearestFibDifference(arr) { // 过滤数组空值、非数字无效值,计算元素总和 const validNums = arr.filter(item => typeof item === 'number' && !isNaN(item)); const total = validNums.reduce((sum, cur) => sum + cur, 0); // 总和本身是斐波那契数时直接返回差值0 if (isFibonacci(total)) return 0; // 向下查找小于总和的最大斐波那契数 let lowerFib = total - 1; while (lowerFib > 0 && !isFibonacci(lowerFib)) { lowerFib--; } // 向上查找大于总和的最小斐波那契数 let higherFib = total + 1; while (!isFibonacci(higherFib)) { higherFib++; } // 返回两个方向中更小的差值 return Math.min(total - lowerFib, higherFib - total); } // 测试用例 const inputArray = [15, 1, 3]; const output = calcNearestFibDifference(inputArray); console.log(output); // 运行输出2,符合预期
关键修改点说明
- 修正原数组的语法错误,移除多余逗号避免空元素
- 保留原有成熟的斐波那契数判断逻辑,减少重复代码
- 新增数组有效值过滤、求和逻辑,适配数组输入场景
- 新增双向查找逻辑,分别定位总和上下两侧最近的斐波那契数,取最小差值返回
- 测试场景中总和19的下侧最近斐波那契数为13(差值6),上侧最近斐波那契数为21(差值2),最终返回结果2,和需求一致
内容的提问来源于stack exchange,提问作者iyans
相关产品推荐
相关产品推荐

