首页 > 其他分享 >day24

day24

时间:2022-11-22 21:47:19浏览次数:48  
标签:nums int day24 tokens result push st1

【0150.逆波兰表达式求值】

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st1;
        long long temp1;
        long long temp2;
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens[i] == "+") {
                 temp1 = st1.top();
                 st1.pop();
                 temp2 = st1.top();
                 st1.pop();
                 st1.push(temp1 + temp2);
            }
            else if (tokens[i] == "+") {
                 temp1 = st1.top();
                 st1.pop();
                 temp2 = st1.top();
                 st1.pop();
                 st1.push(temp1 - temp2);
            }
            else if (tokens[i] == "*") {
                 temp1 = st1.top();
                 st1.pop();
                 temp2 = st1.top();
                 st1.pop();
                 st1.push(temp1 * temp2);
            }
            else if (tokens[i] == "/") {
                 temp1 = st1.top();
                 st1.pop();
                 temp2 = st1.top();
                 st1.pop();
                 st1.push(temp2 / temp1);
            }
            else {  
                st1.push(stoll(tokens[i]));
            }
        }
        return st1.top();
    }
};
  • 运行成功 开始不成功 把 return st1.top(); 改成 int result = st1.top(); return result;成功了 改回去想看看是什么问题结果竟然也成功了 所以上面那段代码是正确的 不知道为什么之前不成功现在却成功了
  • 思路没问题 跟之前本科学校老师讲过的一样 就是没实现过 所以代码语句上有些需要留意的
    • 设置成 long long 或者 int 应该都没问题
    • 注意 默认pop()函数只能删除栈顶元素 不能获取栈顶元素值 所以需要获取栈顶元素值就需要top()
    • 当获得的字符数组元素值是'+' '-' '*' '/' 时 需要进行对应的操作 但是当前tokens[i]只是字符 并不是运算符号 因此 我就想 有什么函数可以让我获得的tokens[i] 就能进行对应字符 对应的运算效果 但是没有这个函数 。。。自己动手实现这个效果思路很简单 就是if(字符是'+') 那就temp1 + temp2; if(字符是'-') 那就temp1 - temp2; 乘法除法类似。
    • st1.push(stoll(tokens[i])); stoll函数 强制类型转换为long long int型 类似的stol强制转换为long int型。 因为push(元素必须是int 型)
  • 卡哥代码
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
<<<<<<< HEAD
        stack<long long> st;
=======
        // 力扣修改了后台测试数据,需要用longlong
        stack<long long> st; 
>>>>>>> 28f3b52a82e3cc650290fb02030a53900e122f43
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
                if (tokens[i] == "+") st.push(num2 + num1);
                if (tokens[i] == "-") st.push(num2 - num1);
                if (tokens[i] == "*") st.push(num2 * num1);
                if (tokens[i] == "/") st.push(num2 / num1);
            } else {
                st.push(stoll(tokens[i]));
            }
        }

        int result = st.top();
        st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事)
        return result;
    }
};

【0239.滑动窗口最大值】

class Solution {
public:
    int maxx(int n1, int n2, int n3) {
        int result = n1;
        if (result < n2)
            result = n2;
        if (result < n3)
            result = n3;
        return result;
    }
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int resultSize = nums.size() - k + 1;
        vector<int> result (resultSize, 0);
        int j = 0;
        queue<int> que1;
        for (int i =0; i < nums.size(); i++) {
            if (i < k) {
                que1.push(nums[i]);
                if (i == k-1) {
                    result[j] = maxx(nums[i], nums[i - 1], nums[i - 2]);
                    j++;
                }
                break;
            }
            que1.pop();
            que1.push(nums[i]);
            result[j] = maxx(nums[i], nums[i - 1], nums[i - 2]);
            j++;
        }
        return result;
    }
};
  • break 换成 continue 否则只执行了一次就不再循环了
class Solution {
public:
    int maxx(int n1, int n2, int n3) {
        int result = n1;
        if (result < n2)
            result = n2;
        if (result < n3)
            result = n3;
        return result;
    }
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int resultSize = nums.size() - k + 1;
        vector<int> result (resultSize, 0);
        int j = 0;
        queue<int> que1;
        for (int i =0; i < nums.size(); i++) {
            if (i < k) {
                que1.push(nums[i]); 
                if (i == 0 && nums.size() == 1) {
                    result[j] = nums[i];
                    return result;
                }
                if (i == 1 && nums.size() == 2) {
                    result[j] = nums[i] > nums[i - 1] ? nums[i] : nums[i - 1];
                    return result;
                }
                if (i == k-1) {
                    result[j] = maxx(nums[i], nums[i - 1], nums[i - 2]);
                    j++;
                }
                continue;
            }
            que1.pop();
            que1.push(nums[i]);
            result[j] = maxx(nums[i], nums[i - 1], nums[i - 2]);
            j++;
        }
        return result;
    }
};
  • 上面代码运行部分不通过

    输入[1,3,-1,-3,5,3,6,7] 3

    输出[3,3,5,5,6,7]

    预期结果[3,3,5,5,6,7]

    但是 有问题的用例:

    Line 1034: Char 34: runtime error: addition of unsigned offset to 0x602000000210 overflowed to 0x60200000020c (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:34

    最后执行的输入:

    [1,-1] 1

  • 这个思路 只能说是对了一半 想到了队列 但不会用 这就是当时课堂上 类似课后理论题见过 但代码题没实现过

  • 卡哥思路 单调队列能理解 但怎么想到的 怎么在这道题用的 我暂时还没看懂

class Solution {
private:
    class MyQueue { //单调队列(从大到小)
    public:
        deque<int> que; // 使用deque来实现单调队列
        // 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
        // 同时pop之前判断队列当前是否为空。
        void pop(int value) {
            if (!que.empty() && value == que.front()) {
                que.pop_front();
            }
        }
        // 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
        // 这样就保持了队列里的数值是单调从大到小的了。
        void push(int value) {
            while (!que.empty() && value > que.back()) {
                que.pop_back();
            }
            que.push_back(value);

        }
        // 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
        int front() {
            return que.front();
        }
    };
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        vector<int> result;
        for (int i = 0; i < k; i++) { // 先将前k的元素放进队列
            que.push(nums[i]);
        }
        result.push_back(que.front()); // result 记录前k的元素的最大值
        for (int i = k; i < nums.size(); i++) {
            que.pop(nums[i - k]); // 滑动窗口移除最前面元素
            que.push(nums[i]); // 滑动窗口前加入最后面的元素
            result.push_back(que.front()); // 记录对应的最大值
        }
        return result;
    }
};

标签:nums,int,day24,tokens,result,push,st1
From: https://www.cnblogs.com/deservee/p/16916528.html

相关文章

  • 代码随想录Day24
    LeetCode257二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。示例:思路:终止逻辑:走到叶子节点,所以原本终止......
  • day24 - 表格 内联等
    表格​实现表格的创建行操作:tr列操作:td​colspon实现跨列操作rowspon实现跨行操作1<!DOCTYPEhtml>2<htmllang="en"xmlns="http://www.w3.org/1999/html......
  • 牛客java选择题每日打卡Day24
    牛客java选择题每日打卡Day24......
  • day24 设计模式
    day24设计模式概述:设计模式是一种解决某个问题的固定模式(原理都是一样的),它不区分语言.常用的设计模式有23种,他分为三类(主要针对的是类和对象)设计......
  • day24 JDBC批处理(通用泛型查询方法 & 下划线转驼峰命名法)
    批处理publicstaticIntegeraddBatch(String[]sqls){ init(); try{ //设置关闭自动提交 conn.setAutoCommit(false); Statementstmt=conn.createState......
  • 代码随想录day24 | 77. 组合
    77.组合题目|文章思路:回溯实现点击查看代码classSolution{public:vector<vector<int>>combine(intn,intk){backTracking(n,k,1);......
  • 代码随想录day24
    77.组合解题步骤:  1、确定回溯函数参数及返回值;        vector<vector<int>> result;        vector<int> path;        void back......
  • day24 77
    回溯算法数字组合问题77.组合classSolution{List<List<Integer>>result=newArrayList<>();LinkedList<Integer>path=newLinkedList<>();publ......
  • Day24
    面向对象编程面像过程思想:​第一步做什么,第二个做什么,适合处理一些较为简单的问题面向对象思想:物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后......
  • day24--Java集合07
    Java集合0714.HashMap底层机制(k,v)是一个Node,实现了Map.Entry<K,V>,查看HashMap的源码可以看到jdk7.0的HashMap底层实现[数组+链表],jdk8.0底层[数组+链表+红黑树]14.......