欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛客编程巅峰赛S2第5场 - 青铜&白银&黄金

程序员文章站 2022-06-15 19:47:15
...

牛客: 牛客编程巅峰赛S2第5场 - 青铜&白银&黄金


牛客编程巅峰赛S2第5场 - 青铜&白银&黄金

基本上三题都是直接模拟就能过



第一题: 牛牛算数

牛客编程巅峰赛S2第5场 - 青铜&白银&黄金

直接排序,求和取平均值 以及 len 定位到中位数

直接比较就行。

AC Code

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 
     * @return int整型
     */
    public int Answerofjudge (int[] arr) {
        // write code here
        double avg = 0;
        Arrays.sort(arr);
        int len = arr.length;
        for(int i = 0; i < len ; i++){
            avg += arr[i];
        }
        double midv = 0;
        if(len % 2 == 1)
            midv = arr[len / 2];
        else 
            midv = (arr[len / 2] + arr[(len / 2) - 1]) / 2.0;
       
        
        if(midv > (avg / (double)len)) return 1;
        else if(midv < (avg / (double)len)) return -1;
        else return 0;
    }
}




第二题: 怕npy的牛牛

牛客编程巅峰赛S2第5场 - 青铜&白银&黄金

一开始思路: 双重循环暴力截取所有区间的子串,算出能截取到的最长子串, 超时两次。 ( 有点想到 最长子序列

换了种思路, 直接 双指针 + 模拟

使用 slow 记录子串开始的位置, i 为子串结束的位置。

当子串同时存在 n p y 三个字符的时候, slow 向后移动,直到这三个字符没有同时存在。


AC Code

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回符合题意的最长的子串长度
     * @param x string字符串 
     * @return int整型
     */
    public int Maximumlength (String s) {
        // write code here
        int ans = 1;
        int slow = 0;
        int n = 0, p = 0, y = 0;
        int temp = 0;
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == 'n') n++;
            else if(s.charAt(i) == 'p') p++;
            else if(s.charAt(i) == 'y') y++;
            
            while(n >= 1 && p >= 1 && y >= 1) {
                ans = Math.max(ans, i - slow);
                if(s.charAt(slow) == 'n') n--;
                else if(s.charAt(slow) == 'p') p--;
                else if(s.charAt(slow) == 'y') y--;
                slow++;
            }
            
            ans = Math.max(ans, i - slow + 1);
        }
        
        return ans;
    }
    
}





第三题: 牛牛与后缀表达式

牛客编程巅峰赛S2第5场 - 青铜&白银&黄金



给定字符串, 计算其中的结果,就是那种表达式计算的题

一般思路: 创建两个栈, 一个存储操作数, 一个存储操作符,每次遇到操作符, 取出两个数进行计算。然后存回操作数栈中。

这题使用一个栈就行了, 因为这个不用考虑运算符优先级, 先在前面的运算符优先运算。

模拟。


AC Code

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 给定一个后缀表达式,返回它的结果
     * @param str string字符串 
     * @return long长整型
     */
    public long solve (String str) {
        // write code here
        Stack<Long> s = new Stack<>();
        Stack<String> op = new Stack<>();
        char[] cs = str.toCharArray();
        
        long temp = 0;
        for(int i = 0; i < cs.length; i++){
            if(cs[i] == '#'){
                s.add(temp);
                temp = 0;
                continue ;
            }
            if(cs[i] >= '0' && cs[i] <= '9'){
                temp = temp * 10 + (cs[i] - '0');
            } else {
                // 操作符
                // 取出两个数
                long a = s.pop();
                long b = s.pop();
                long res = 0;
                if(cs[i] == '+'){
                    res = a + b;
                }else if(cs[i] == '-'){
                    res = (b - a);                    
                } else if(cs[i] == '*'){
                    res = (a * b);
                }
                
                // 回栈
                s.add(res);
            }
            
        }
        
        return s.pop();
    }
}