365天挑战LeetCode1000题——Day 071 阶乘后的零 阶乘函数后 K 个零 最小栈 移除无效的括号

本文解析了四个经典算法题目,包括求解阶乘后零的数量、构建最小栈、移除无效括号等问题,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

172. 阶乘后的零

在这里插入图片描述

代码实现(自解)

class Solution {
public:
    int trailingZeroes(int n) {
        int ans = 0;
        while (n) {
            n /= 5;
            ans += n;
        }
        return ans;
    }
};

793. 阶乘函数后 K 个零

在这里插入图片描述

代码实现(自解)

class Solution {
public:
    int zeta(long x) {
        int res = 0;
        while (x) {
            res += x / 5;
            x /= 5;
        }
        return res;
    }

    long long help(int k) {
        long long r = 5LL * k;
        long long l = 0;
        while (l < r) {
            long long mid = (l + r + 1) / 2;
            if (zeta(mid) <= k) {
                l = mid;
            } else {
                r = mid - 1;
            }
        }
        return l;
    }

    int preimageSizeFZF(int k) {
        if (k <= 1) return 5;
        if (k == 5) return 0;
        return help(k) - help(k - 1);
    }
};

155. 最小栈

在这里插入图片描述

代码实现(自解)

class MinStack {
private:
    stack<long long> myStack;
    long long minNum;
public:
    MinStack() {

    }
    
    void push(int val) {
        if (myStack.empty()) {
            myStack.push(val);
            minNum = val;
        }
        else if (val >= minNum) {
            myStack.push(val);
        }
        else {
            myStack.push(val + (val - minNum));
            minNum = val;
        }
    }
    
    void pop() {
        if (myStack.empty()) return;
        if (myStack.top() < minNum) minNum = minNum + (minNum - myStack.top());
        myStack.pop();
    }
    
    int top() {
        return max(myStack.top(), minNum);
    }
    
    int getMin() {
        return minNum;
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

1249. 移除无效的括号

在这里插入图片描述

代码实现(自解)

class Solution {
public:
    string minRemoveToMakeValid(string s) {
        string ans;
        stack<char> check;
        for (char& c : s) {
            if (c == '(') check.push(c);
            else if (c == ')') {
                if (check.empty() || check.top() != '(') {
                    c = '*';  
                }
                else {
                    check.pop();
                }
            }
        }
        int n = s.size();
        while (!check.empty() && n--) {
            if (s[n] == '(') {
                s[n] = '*';
                check.pop();
            }
        }
        for (char c : s) {
            if (c != '*') ans += c;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值