笨阶乘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)。

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


参考来源

相关推荐
Thecozzy9 小时前
大厂 AI Coding 面试大招
人工智能·面试·职场和发展
知无不研9 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
半夏微凉半夏殇10 小时前
x11与weston对比,优先选哪个
leetcode·均值算法·eclipse
2501_9065651210 小时前
数学之美探究
算法
oier_Asad.Chen10 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
cfm_291410 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
Dr.kangder10 小时前
嵌入式面试总结(十五)——异常处理
单片机·面试·职场和发展·系统架构·嵌入式
C++ 老炮儿的技术栈11 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_4480111611 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据11 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具