打卡(14)

数据结构课上是用逆波兰式写的,然后这个题目由于只要+ -两运算,则可以进行简化。
这个题还有点无聊的加上了空字符,如果上来就觉得不好写的话,其实也是自己没有记牢数据结构的知识吧。
这个还是读懂的别人的代码,用到了编译原理词法分析。
目前还没学,不过看起来他的逻辑是从上到下的,而似乎不是平常的那种思考方式。
(建议默写。

class Solution {
    
    
public:
    long long calculate(string s) {
    
    
        idx  = 0,len= s.size();//初始化序号为0,并且计算其字符串的长度
        this->s = s;//将私有的s设置为s
        long long tmp = findElem();//寻找第一个计算的元素
        while(idx != len){
    
    //当还没有遍历所有的元素的时候,继续向下操作
            operate(tmp);//抽象操作
        }
        return tmp;//将答案返回
    }
private:
    int idx,len;//定义序号和长度
    string s;//所以上述的s必须要使用this指针,否则将会造成值无法进行传递
    long long findElem(){
    
    //寻找下一个元素
        // 寻找当前准备参与运算的数
        while (idx < len && s[idx] == ' ')
            ++idx;
        if (s[idx] == '(')
            return calBrackets();//若遇见了左边括号,那么先计算括号中的元素值
        long long tmp = 0;//中间变量
        if (s[idx] == '+' || s[idx] == '-')//若判定运算为加减运算
            return operate(tmp);//继续操作
        while (idx != len && isdigit(s[idx]))//若该数字是连续的多位数数字,则进行如此处理
            tmp = tmp*10 + s[idx++] -'0';
        return tmp;//返回值
    }
    int calBrackets(){
    
    
        // 计算括号内的值
        ++idx; //'('
        long long tmp = findElem();
        while (idx < len && s[idx]!= ')'){
    
    
            operate(tmp);//递归到括号内进行操作
        }
        ++idx; // ')'
        return tmp;//返回值
    }
    long long operate(long long& tmpAns){
    
    
        // 寻找当前的运算符和下一个运算数,并且将该运算作用于当前结果
        while (idx < len && s[idx] == ' ')
            ++idx;
        if (s[idx] == '+'){
    
    
            ++idx; // '+'
            tmpAns += findElem();
        }
        else if (s[idx] == '-'){
    
    
            ++idx; // '-'
            tmpAns -= findElem();
        }
        return tmpAns;
    }
};

所以现在的水平就只是够写简单题目了吗?尬笑
https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof/submissions/

class Solution {
    
    
public:
    bool isStraight(vector<int>& nums) {
    
    
        int min=14;
        int max=-1;
        int cnt0=0;
        int dex[14]={
    
    0};
        for(int i=0;i<5;i++){
    
    
            if(nums[i]==0){
    
     
                cnt0++;
                continue;
            }
            if(++dex[nums[i]]==2) return false;
            if(min>nums[i]) min=nums[i];
            if(max<nums[i]) max=nums[i];
        }
        int leap=max-min;
        if(leap==4||leap<4&&(leap+cnt0>=4)) return true;
        else return false;
    }
};

跑步第一天,感觉很催眠。

猜你喜欢

转载自blog.csdn.net/weixin_47741017/article/details/114806944
14