笨阶乘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 == 1 或 N % 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)。

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


参考来源

相关推荐
机 _ 长几秒前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
xiaoye-duck16 分钟前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚39 分钟前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
·present·1 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
早起CaiCai1 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码1 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
FRing031 小时前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光1 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
猿人谷2 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
starzy19902 小时前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala