打卡(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;
    }
};

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值