You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Codewars练习中JS连续奇数三角形行和计算遇阻,求指导

解决连续奇数三角形行和的问题

嘿,我来帮你搞定这个问题!先理清楚需求:给定由连续奇数组成的三角形(第1行1个奇数,第2行2个,以此类推),输入行索引n(从1开始),计算该行所有数的和。

先看你写的代码:

function rowSumOddNumbers(n) { 
  let sum = 1; 
  for (let i = 1; i <= 2*(n-1); i++){ 
    sum+= i; 
  } 
  return sum; 
}

你的代码问题在哪?

这个逻辑其实完全跑偏啦:你是从1开始累加了2*(n-1)个整数,既没针对奇数,也没定位到第n行的数,只有n=1的时候碰巧对,其他行结果都不对。

其实有个超棒的规律!

咱们手动算几行看看:

  • 第1行:1 → 和为 1 = 1³
  • 第2行:3 + 5 = 8 = 2³
  • 第3行:7 + 9 + 11 = 27 = 3³
  • 第4行:13 + 15 + 17 + 19 = 64 = 4³

发现没?第n行的和就是n的三次方!这比写循环高效太多了,直接一行代码搞定。

为什么是n³?(推导一下,帮你理解)

如果好奇背后的逻辑,咱们可以推一遍:

  1. 前n-1行总共有 1+2+...+(n-1) = n(n-1)/2 个奇数,所以第n行的第一个数是第 n(n-1)/2 + 1 个奇数。
  2. 第k个奇数的公式是 2k-1,代入后得到第n行第一个奇数:2*(n(n-1)/2 +1) -1 = n² -n +1。
  3. 该行是n个连续奇数,构成等差数列,末项就是 首项 + 2*(n-1) = n² +n -1。
  4. 用等差数列求和公式:和 = n*(首项+末项)/2,代入后化简就是 n³。

正确代码

最优解法(O(1)时间复杂度)

function rowSumOddNumbers(n) {
  return n ** 3;
}

循环实现(如果想练习循环逻辑)

要是你就是想写循环来实现,那可以先定位到第n行的第一个奇数,再累加n个连续奇数:

function rowSumOddNumbers(n) {
  let sum = 0;
  const firstOdd = n * n - n + 1; // 第n行的第一个奇数
  for (let i = 0; i < n; i++) {
    sum += firstOdd + 2 * i; // 每次加2,得到下一个奇数
  }
  return sum;
}

两种写法都能得到正确结果,显然第一种利用数学规律的写法更高效哦~

内容的提问来源于stack exchange,提问作者Shinichi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:02:46