微众银行笔试

1.给定x^3+y^4+z^5=k
import java.util.*;

/**
 * @author wanna
 * @version v1.0
 * @Package com.wanna.main31
 * @date 2021/9/24 9:50 上午
 */
public class Main {
    /*
        @微众银行
        给定一个k,求是否有正整数x,y,z符合x^3+y^4+z^5=k(k<=10^12)。
        如果存在输出YES,不存在输出NO
        第一行输入是一个n,代表即将要输入的k的行数
        后面n行输入的就k,一个k对应一个YES/NO
     */

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long N = scanner.nextLong();  //数据的行数...
        List<Long> list = new ArrayList<>();  //k可以到10^12次方,得用long去存了
        //扫描数据放到结果中
        for (long i = 0; i < N; i++) {
            list.add(scanner.nextLong());
        }
        list.forEach(Main::process2);
    }

    /**
     * 直接三重暴力解,能过36%的测试用例
     *
     * @param num num
     */
    public static void process(Long num) {
        boolean flag = false;
        for (long i = 1; i < num; i++) {
            for (long j = 1; j < num; j++) {
                for (long k = 1; k < num; k++) {
                    if ((long) Math.pow(i, 3) + (long) Math.pow(j, 4) + (long) Math.pow(k, 5) == num) {
                        flag = true;
                        break;
                    }
                }
            }
        }
        System.out.println(flag ? "YES" : "NO");
    }

    /**
     * 优化,能过73%的测试用例...不知道该怎么继续优化了
     *
     * @param num num
     */
    public static void process2(Long num) {
        Set<Long> set = new HashSet<>();
        boolean flag = false;
        for (long i = 1; i <= Math.pow(num, 0.34); i++) {  // 1/3
            for (long j = 1; j <= Math.pow(num, 0.25); j++) {  // 1/4
                set.add((long) Math.pow(i, 3) + (long) Math.pow(j, 4));
            }
        }
        for (long k = 1; k <= Math.pow(num, 0.2); k++) {  // 1/5
            if (set.contains((long) (num - Math.pow(k, 5)))) {
                flag = true;
                break;
            }
        }
        System.out.println(flag ? "YES" : "NO");
    }
}
2.机甲
import java.util.Scanner;

/**
 * @author wanna
 * @version v1.0
 * @Package com.wanna.main33
 * @date 2021/9/24 9:51 上午
 */
public class Main {
    /*
     @微众银行
     一台机甲在一个二维空间里移动,它的移动受到一串事先写好的指令的控制,每条指令会让它往特定方向移动一格。
     该空间为矩形,四周都是墙壁,无法通过,空间中每个格子位置的阻力不同,我们用一个数值来表示它的阻力,
     还有一些格子存在障碍无法通过。机器人每走一格,需要消耗能量,能量数为走之前和走之后位置的阻力数值中较大的那个数。
     当它的方向改变时,消耗能量 x,当它走向墙壁或者障碍物时,会停在原地并消耗能量 y(如果需要,仍会先改变方向)。
     一开始它位于整个空间的左上角,第一步移动不需要花能量改变方向,请计算它最后总共消耗了多少能量。

    输入描述
    第一行四个整数 n, m, x, y,(0 < n, m <= 100,1 <= x, y <= 100000)
    后面 n 行,每行 m 个数,形成一个方阵,表示各个格子位置的阻力数值,如果为 -1,表示该位置无法通过。各个位置的数值范围为 [-1, 100000]。
    最后一行一个字符串,由 hjkl 四种字母组成,表示指令序列。h 表示向左移动一格,
    j 表示向下移动一格,k 表示向上移动一格,l 表示向右移动一格。字符串长度不超过 100000。

    输出描述
    一个整数,表示消耗的总能量。

    AC 100%
     */

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        int[][] grid = new int[n][m];  //申请一个矩阵空间

        //读取
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                grid[i][j] = scanner.nextInt();
            }
        }
        char[] command = scanner.next().toCharArray();  //指令
        process(grid, command, x, y);
    }

    //x是方向改变的消耗
    //走向墙壁或者是障碍物,会停留在原地,但是消耗能量消耗y
    //如果grid[i][j]=-1,那么表示的是不可走
    public static void process(int[][] grid, char[] command, int x, int y) {
        long count = 0;  //记录能量的消耗值...
        int xPos = 0, yPos = 0;
        //消耗为走之前和之后的能量最大值
        //遍历所有的命令集合...
        //hjkl,左下上右
        for (int i = 0; i < command.length; i++) {
            //如果遇到了墙壁
            if ((command[i] == 'h' && yPos == 0) ||
                    (command[i] == 'k' && xPos == 0) ||
                    (command[i] == 'j' && xPos == grid.length - 1) ||
                    (command[i] == 'l' && yPos == grid[0].length - 1)) {
                count += y;
            }
            //走到这里不是碰到墙壁...

            //如果是碰到了障碍物的话...需要累加上y
            else if ((command[i] == 'h' && grid[xPos][yPos - 1] == -1) ||
                    (command[i] == 'k' && grid[xPos - 1][yPos] == -1) ||
                    (command[i] == 'j' && grid[xPos + 1][yPos] == -1) ||
                    (command[i] == 'l' && grid[xPos][yPos + 1] == -1)) {
                count += y;
                //如果方向发生了改变
            } else {
                int last = grid[xPos][yPos];  //记录走之前的阻力
                int current;
                //左
                if (command[i] == 'h') {
                    yPos--;
                    //上
                } else if (command[i] == 'k') {
                    xPos--;
                    //下
                } else if (command[i] == 'j') {
                    xPos++;
                    //右
                } else {
                    yPos++;
                }
                current = grid[xPos][yPos];
                count += Math.max(last, current);  //应该加上两者的最大值...
            }
            //如果方向发生了改变
            if (i >= 1 && command[i] != command[i - 1]) {
                count += x;
            }
        }
        System.out.println(count);
    }
}
3.前缀序列
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author wanna
 * @version v1.0
 * @Package com.wanna.main32
 * @date 2021/9/24 9:50 上午
 */
public class Main {

    /*
     @微众银行
     题目描述:
     已知一个长度为n的序列A。我们求出了它的前缀序列,但是却不小心把它的原序列丢失了,请你从它的前缀序列中推出它的原序列,并输出出来。

     这里的前缀序列B定义为,B[i]为所有下标小于等于i中的元素中,所有奇数位置的和减去所有偶数位置的和。A序列和B序列的下标均从1开始。

     输入描述
     输入第一行仅包含一个正整数n,表示序列的长度。(1<=n<=10000)
     输入第二行包含n个整数,空格隔开,表示一个前缀序列,所有整数的绝对值都小于等于10^9。

     输出描述
     输出仅包含一行,包含n个整数,表示原序列,中间用空格隔开。
     */

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] list = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            list[i] = scanner.nextInt();
        }
        process(list, N);
    }

    public static void process(int[] list, int N) {  //AC 100%
        int[] old = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            int sign = i % 2 != 0 ? 1 : -1;
            old[i] = (list[i] - list[i - 1]) * sign;
        }
        Arrays.stream(old, 1, N + 1)
                .mapToObj(String::valueOf)
                .reduce(((left, right) -> left + " " + right))
                .ifPresent(System.out::println);
    }
}




#微众银行##笔经#
全部评论
我是昨天的笔试,一模一样的题目,第一题也是ac73 第二题没推出来 第三题ac100,可惜了 早点看你的贴我就能写完了
3 回复
分享
发布于 2021-11-06 11:43
第一题32位系统long也存不下吧
点赞 回复
分享
发布于 2021-11-05 11:07
阅文集团
校招火热招聘中
官网直投
2道a了都没面试机会吗
点赞 回复
分享
发布于 2022-04-09 22:34
楼主 感觉微众怎么样
点赞 回复
分享
发布于 2022-04-10 15:31

相关推荐

15 89 评论
分享
牛客网
牛客企业服务