1006. 笨阶乘
通常,正整数 n
的阶乘是所有小于或等于 n
的正整数的乘积。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
。
相反,我们设计了一个笨阶乘 clumsy
:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。
例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1
。然而,这些运算仍然使用通常的算术运算顺序:我们在任何加、减步骤之前执行所有的乘法和除法步骤,并且按从左到右处理乘法和除法步骤。
另外,我们使用的除法是地板除法(floor division),所以 10 * 9 / 8
等于 11
。这保证结果是一个整数。
实现上面定义的笨函数:给定一个整数 N
,它返回 N
的笨阶乘。
示例 1:
输入:4 输出:7 解释:7 = 4 * 3 / 2 + 1
示例 2:
输入:10 输出:12 解释:12 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1
提示:
1 <= N <= 10000
-2^31 <= answer <= 2^31 - 1
(答案保证符合 32 位整数。)原站题解
python3 解法, 执行用时: 36 ms, 内存消耗: 14.9 MB, 提交时间: 2022-11-29 14:46:42
class Solution: def clumsy(self, n: int) -> int: f = [1, 1, 2, 6] g = [0, 1, 2, 6, 7] if n <= 4: return g[n] k, b = n // 4, n % 4 return 2*n - 4*k + 2 - f[b]
javascript 解法, 执行用时: 56 ms, 内存消耗: 40.9 MB, 提交时间: 2022-11-29 14:45:51
/** * @param {number} n * @return {number} */ var clumsy = function(n) { if (n === 1) { return 1; } else if (n === 2) { return 2; } else if (n === 3) { return 6; } else if (n === 4) { return 7; } if (n % 4 === 0) { return n + 1; } else if (n % 4 <= 2) { return n + 2; } else { return n - 1; } };
golang 解法, 执行用时: 4 ms, 内存消耗: 1.8 MB, 提交时间: 2022-11-29 14:45:25
func clumsy(n int) (ans int) { switch { case n == 1: return 1 case n == 2: return 2 case n == 3: return 6 case n == 4: return 7 case n%4 == 0: return n + 1 case n%4 <= 2: return n + 2 default: return n - 1 } }
golang 解法, 执行用时: 0 ms, 内存消耗: 4.9 MB, 提交时间: 2022-11-29 14:44:06
func clumsy(n int) (ans int) { stk := []int{n} n-- index := 0 // 用于控制乘、除、加、减 for n > 0 { switch index % 4 { case 0: stk[len(stk)-1] *= n case 1: stk[len(stk)-1] /= n case 2: stk = append(stk, n) default: stk = append(stk, -n) } n-- index++ } // 累加栈中数字 for _, v := range stk { ans += v } return }
javascript 解法, 执行用时: 76 ms, 内存消耗: 43 MB, 提交时间: 2022-11-29 14:43:48
/** * @param {number} n * @return {number} */ var clumsy = function(n) { const stack = [n--]; let index = 0; // 用于控制乘、除、加、减 while (n > 0) { if (index % 4 == 0) { stack.push(stack.pop() * n); } else if (index % 4 == 1) { const cur = stack.pop(); stack.push(cur > 0 ? Math.floor(cur / n) : Math.ceil(cur / n)); } else if (index % 4 == 2) { stack.push(n); } else { stack.push(-n); } index++; n--; } // 把栈中所有的数字依次弹出求和 let sum = 0; stack.forEach((element) => { sum += element; }) return sum; };