代码随想录算法训练营第十一天|150 逆波兰表达式求值、239 滑动窗口最大值

一、150 逆波兰表达式求值

int Toint(char*s){
    int num=0;//表示处理后的数字
    int tens = 1;//代表权重
    for(int i=strlen(s)-1;i>=0;i--){//从后往前遍历
        if(s[i]=='-'){//处理负数
            num*=-1;
            break;
        }
        num += (s[i]-'0')*tens;
        tens *=10;
    }
    return num;
}

int evalRPN(char** tokens, int tokensSize) {
    int *stack = (int *)malloc(sizeof(int)*tokensSize);
    int stacktop = 0;
    for(int i =0;i<tokensSize;i++){//遍历字符串数组
        char tmp = (tokens[i])[0];//获取第一个元素
        //if(tmp=='+'||tmp=='-'||tmp=='*'||tmp=='/')//错误
        if (tmp < '0' && (tokens[i])[1] == '\0')
        {//如果是字符
            int num1 = stack[--stacktop];
            int num2 = stack[--stacktop];//从栈中取两个数字
            int result;
            if (tmp == '+') {
                result = num1 + num2;
            } else if (tmp == '-') {
                result = num2 - num1;
            } else if (tmp == '*') {
                result = num1 * num2;
            } else {
                result = num2 / num1;
            }
            stack[stacktop++] = result;
        }else{//是数字
            int num = Toint(tokens[i]);
            stack[stacktop++] = num;
        }
    }
    int result = stack[0];
    free(stack);
    return result;
}

二、239 滑动窗口最大值

int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {
     *returnSize = numsSize - k + 1;
    int *res = (int*)malloc((*returnSize) * sizeof(int));
    assert(res);
    int *deque = (int*)malloc(numsSize * sizeof(int));
    assert(deque);
    int front = 0, rear = 0, idx = 0;

    for (int i  = 0 ; i < numsSize ; i++) {
        while (front < rear && deque[front] <= i - k) {
            front++;
        }

        while (front < rear && nums[deque[rear - 1]] <= nums[i]) {
            rear--;
        }

        deque[rear++] = i;

        if (i >= k - 1) {
            res[idx++] = nums[deque[front]];
        }
    }       

    return res;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值