笨阶乘C++解法详解(力扣1006)

问题解析 :LeetCode 1006 "笨阶乘"要求对正整数 N 按递减顺序依次使用乘 *、除 /、加 +、减 - 四个运算符循环计算,即 clumsy(N) = N * (N-1) / (N-2) + (N-3) - (N-4) * (N-5) / (N-6) + ...,需返回计算结果。核心在于处理运算符优先级(乘除优先于加减)和循环模式。

解法对比

方法 核心思路 时间复杂度 空间复杂度 适用场景
栈模拟 用栈存储中间结果,按运算符优先级处理 O(N) O(N) 通用性强,直观模拟运算过程
数学归纳 观察规律,推导出分段计算公式 O(1) O(1) 效率最高,直接计算

方法一:栈模拟法

通过栈保存待计算的值,遇到乘除立即计算,加减则入栈(减法转为加负数),最后对栈中所有元素求和。

cpp 复制代码
#include <stack>
#include <vector>
using namespace std;

class Solution {
public:
    int clumsy(int N) {
        stack<int> stk;
        stk.push(N);
        N--;
        int index = 0; // 用于循环运算符:0:*, 1:/, 2:+, 3:-
        while (N > 0) {
            if (index % 4 == 0) { // 乘法 int top = stk.top();
                stk.pop();
                stk.push(top * N);
            } else if (index % 4 == 1) { // 除法 int top = stk.top();
                stk.pop();
                stk.push(top / N);
            } else if (index % 4 == 2) { // 加法
                stk.push(N);
            } else { // 减法:转为加负数
                stk.push(-N);
            }
            index++;
            N--;
        }
        // 对栈中所有元素求和 int sum = 0;
        while (!stk.empty()) {
            sum += stk.top();
            stk.pop();
        }
        return sum;
    }
};
  • 时间复杂度:O(N),遍历 N 次。
  • 空间复杂度:O(N),栈最多存储约 N/2 个元素。

方法二:数学归纳法(O(1))

通过观察 N 较大时的计算规律,可发现每 4 个数一组 (N * (N-1) / (N-2) + (N-3))的结果近似为 N+1,剩余部分可推导出分段公式 :

  • N ≤ 2:直接返回 N。
  • N == 3 :返回 6(即 3 * 2 / 1)。
  • N == 4 :返回 7(即 4 * 3 / 2 + 1)。
  • N > 4
    • N % 4 == 0:结果为 N + 1
    • N % 4 == 1N % 4 == 2:结果为 N + 2
    • N % 4 == 3:结果为 N - 1
cpp 复制代码
class Solution {
public:
    int clumsy(int N) {
        if (N <= 2) return N;
        if (N == 3) return 6;
        if (N == 4) return 7;
        // 根据 N 对 4 取余的结果返回对应值
        if (N % 4 == 0) return N + 1;
        if (N % 4 == 1 || N % 4 == 2) return N + 2;
        return N - 1; // N % 4 == 3
    }
};
  • 时间复杂度:O(1)。
  • 空间复杂度:O(1)。

推荐使用数学归纳法,其效率最高,代码简洁。栈模拟法虽直观,但效率较低,适用于需要严格模拟运算过程的场景。


参考来源

相关推荐
君顾15 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
北域码匠6 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
南棱笑笑生6 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
指掀涛澜天下惊6 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
平头哥技术团队6 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌萨奇也要立志学C++6 小时前
【洛谷】kmp算法
开发语言·算法
禹凕6 小时前
Dijkstra算法详解与应用
python·算法
传奇开心果编程7 小时前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
m0_380743877 小时前
给 Claude API 调用补上超时重试和错误分类
开发语言·人工智能·php
Draw Stars7 小时前
Git BASH安装教程
开发语言·git·bash