牛客编程巅峰赛S2第5场

牛牛算数

题目描述

给你一个含有n个元素的数组arr[i],请你告诉牛牛这个数组的中位数大还是平均数大,如果中位数更大输出1,如果平均数更大输出-1,如果中位数和平均数相等输出0

示例1
输入

[1,3,4]

返回值

1

说明

中位数3,平均数约等于2.67,所以输出1

最主要是一个排序,注意 把数 * 1.0 转成double

代码:
class Solution {
public:
    /**
     * 
     * @param arr int整型vector 
     * @return int整型
     */
    int Answerofjudge(vector<int>& arr) {
        // write code here
        long long sum = 0;
        sort(arr.begin(),arr.end());
        for(int i=0;i<arr.size();i++){
            sum+=arr[i];
        }
       
        double num;
        num = 1.0*sum/arr.size();
        double sum2;
        if(arr.size()%2){
            sum2 = arr[arr.size()/2];
        }else{
            sum2 = 1.0*(arr[arr.size()/2]+arr[arr.size()/2-1])/2;
        }
        if(num == sum2) return 0;
        else if(num > sum2) return -1;
        else return 1;
    }
};

怕npy的牛牛

题目描述

牛牛非常怕他的女朋友,怕到了走火入魔的程度,以至于每当他看到一个字符串同时含有n,p,y三个字母他都害怕的不行。现在有一个长度为m的只包含小写字母‘a’-‘z’的字符串x,牛牛想知道能令他不害怕的最长子串的长度是多少。(对于字符串”abc”来说,”c”,”ab”都是原串的子串,但”ac”不是原串子串)

示例1
输入

“abcdefghijklmn”

返回值

14

说明

因为所有子串都不同时含有n,p,y,所以最长子串的长度即为字符串x的长度14。

模拟,昨天听直播说叫双指针,好吧……

代码
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回符合题意的最长的子串长度
     * @param x string字符串 
     * @return int整型
     */
    int Maximumlength(string x) {
        // write code here
        //nnum,pnum,ynum 分贝代表子串中n,p,y数量,l代表左边界
        int nnum=0,pnum=0,ynum=0,l=0;
        int maxx = -1;
        for(int i=0;i<x.length();i++){
            if(x[i]=='n') nnum++;
            if(x[i]=='p') pnum++;
            if(x[i]=='y') ynum++;
            
            while(nnum>=1 && pnum>=1 && ynum>=1){
                if(x[l]=='n') nnum--;
                if(x[l]=='p') pnum--;
                if(x[l]=='y') ynum--;
                l++;
                
            }
            maxx = max(maxx,i-l+1);
            
        }
        return maxx;
    }
};

牛牛与后缀表达式

题目描述

给定牛牛一个后缀表达式s,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,‘#’作为操作数的结束符号。
其中,表达式中只含有‘+’、’-‘、’*‘三种运算,不包含除法。
本题保证表达式一定合法,且计算过程和计算结果的绝对值一定不会超过10^{18}10
18

示例1
输入

“1#1#+”

返回值

2

说明

1#1#+这个后缀表达式表示的式子是1+1,结果为2

这一题应该很常见了,我在最开始学栈时就是把这个题当做模板题的。把数字取出入栈,碰到符号时从栈中取出两个数,进行相应运算,然后在入栈,最后所有运算结束后,栈中剩下的唯一一个元素就是答案。需要注意的是,做减法时,要把第二个取出的数做被减数,第一个数做减数。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 给定一个后缀表达式,返回它的结果
     * @param str string字符串 
     * @return long长整型
     */
    long long solve(string str) {
        // write code here
        stack<long long> st;
        
        long long tmp=0,a,b;
        for(int i=0;i<str.length();i++){
            if(str[i]>='0' && str[i]<='9'){
                tmp*=10;
                tmp+=str[i]-'0';
            }else if(str[i]=='#'){
                st.push(tmp);
                tmp=0;
            }else{
                a = st.top();
                st.pop();
                b = st.top();
                st.pop();
                if(str[i]=='+') st.push(b+a);
                else if(str[i]=='-') st.push(b-a);
                else if(str[i]=='*') st.push(b*a);
            }
        }
        return st.top();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值