在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³?(推导一下,帮你理解)
如果好奇背后的逻辑,咱们可以推一遍:
- 前n-1行总共有
1+2+...+(n-1) = n(n-1)/2个奇数,所以第n行的第一个数是第n(n-1)/2 + 1个奇数。 - 第k个奇数的公式是
2k-1,代入后得到第n行第一个奇数:2*(n(n-1)/2 +1) -1 = n² -n +1。 - 该行是n个连续奇数,构成等差数列,末项就是
首项 + 2*(n-1) = n² +n -1。 - 用等差数列求和公式:
和 = 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
相关产品推荐
相关产品推荐

