360开发笔试0318

40道选择题+2道算法题(ACM模式)

第一题:第一行输入整数n代表总共有n扇未开的门

第二行输入每天给了第几扇门的钥匙,例如 5 3 1 2 4; 第三天给了第一扇门的钥匙

从第一扇门开始开启,只有开了前面的门才能开后面的门

例如:5

5 3 1 2 4

输出:3 4 4 5 5

初始化,将第几扇门的钥匙第几天拿到赋值给数组。

例题初始化后的数组为: 3 4 2 5 1

之后遍历一遍就可以了 比前一天小就等于前一天的值 3 4 4 5 5

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] keyDate = new int[n];
        int[] open = new int[n];
        for (int i = 0; i < n; i++) {
            keyDate[i] = scan.nextInt();
            open[keyDate[i]-1] = i + 1;//初始化
        }
        for (int i = 1; i < n; i++) {
            if(open[i] < open[i-1]) open[i] = open[i-1];
        }
        for (int i = 0; i < n-1; i++) {
            System.out.print(open[i] + " ");
        }
        System.out.print(open[n - 1]);
    }
}

第二题:给出一些方程仅包含加号等号和乘号;(没有前导0,首尾不为运算符,有且仅有一个等号)

请判断这些方程能否通过插入至多一个数位(若原方程成立则可以不插)使得方程成立。

插入一个数位即将方程视为一个字符串,并将一个0到9之间的数插入中间,开头或末尾。

输入:第一行有一个整数,代表方程的数量。

接下来T行是T个方程,方程只有一个等号,且保证输入合法性,没有前导0,前后没有运算符。

输出:对于每个方程,若其成立或可以通过往该方程中插入一个数位使得方程成立,则输入Yes,否则输出No。

例如:

6

16=1+2 * 3

7 * 8 * 9=54

1+1=1+22

4 * 6=22+2

15+7=1+2

11+1=1+5

输出:

Yes

Yes

No

Yes

Yes

No

思路:将0-9各个位置插入遍历一遍就可以了

注意写的计算器如果是int只能过测82%,改成long可以AC

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int t = scan.nextInt();
        for (int i = 0; i < t; i++) {
            String s = scan.next();
            if(isItFunction(s)) System.out.println("Yes");
            else System.out.println("No");
        }
    }
    public static boolean isItFunction(String s) {
        if(s.length()>1000) return false;
        String[] str = s.split("=");
        //如果直接相等
        if(calculate(str[0]) == calculate(str[1])) return true;
        //如果插入一个字符相等
        for (int i = 0; i <= s.length(); i++) {
            StringBuilder strInsert = new StringBuilder(s);
            for (int j = 0; j <= 9; j++) {
                strInsert.insert(i, j);
                str = strInsert.toString().split("=");
                if(calculate(str[0]) == calculate(str[1])) return true;
                strInsert.deleteCharAt(i);
            }
        }
        return false;
    }
    public static long calculate(String s) {
        long sum = 0;
        String num = "";
        Stack<Long> stack = new Stack<>();
        long temp = 0;
        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)){
                case '+':
                    if(temp == 0){
                        stack.push(Long.parseLong(num));
                        num = "";
                    }else{
                        stack.push(stack.pop()*Long.parseLong(num));
                        num = "";
                        temp = 0;
                    }
                    break;
                case '*':
                    if(temp == 0){
                        stack.push(Long.parseLong(num));
                        num = "";
                        temp = stack.peek();
                    }else{
                        stack.push(stack.pop()*Long.parseLong(num));
                        num = "";
                        temp = stack.peek();
                    }
                    break;
                default:
                    num += s.charAt(i);
            }
        }
        if(temp == 0){
            stack.push(Long.parseLong(num));
        }else{
            stack.push(stack.pop()*Long.parseLong(num));
        }
        while (!stack.isEmpty()){
            sum += stack.pop();
        }
        return sum;
    }
}

#360#
全部评论

相关推荐

想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
8 10 评论
分享
牛客网
牛客企业服务