阿里3.23笔试

第一题,快速幂实现版本,笔试的时候没写出来,不知道是否能AC,欢迎大佬来喷!
题目:现有n个人,要从n个人里选择任意数量的人组成一个队伍,再在选择出的人中选择一个队长,如果两个方案选取的人的集合不同或队长不同,认为是不同的方案,求不同的方案数对1000000007取模的结果。
1 <= n <= 1000000000
import java.util.Scanner;

public class Main {
    static int mod = 1000000007;

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();

        //  结果等于 n * 2 ^ (n - 1)
        System.out.println((n * powSelf(2, n - 1)) % mod);

    }

    //  快速幂的实现
    public static long powSelf(int x, int n) {
        // n >= 0
        if (n == 0) {
            return 1;
        }
        long res = 1;
        long temp = x % mod;
        while (n > 0) {
            if ((n & 1) == 1) {
                res = (res * temp) % mod;
            }
            n >>= 1;
            temp = (temp * temp) % mod;
        }
        return res;
    }

}

附上网上找的取模运算性质链接https://blog.csdn.net/Mtrix/article/details/47087647
第二题代码,也是看了大佬的之后才写的,发出来让大家检查,也方便之后自己复习。
import java.util.LinkedList;
import java.util.Scanner;

public class Main2 {
    static int [][] forward = new int[][]{{-1,0},{1,0},{0,1},{0,-1}};
    static class Node{
        int node_x;
        int node_y;
        Node(int x, int y){
            node_x = x;
            node_y = y;
        }
    }
    //  使用广度优先搜索的方法
    public static void main(String[] args){
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();
        int m = reader.nextInt();
        reader.nextLine();
        char[][] strChar = new char[n][m];

        int end_x = -1;
        int end_y = -1;
        LinkedList<Node> queue = new LinkedList<>();

        int[][][] dp = new int[n][m][6];  //  代dp[i][j][k]代表到达[i][j]位置,用了k个飞行器时(不一定要都用,是有k个飞行器的条件),最少经过的步数

        //  给dp中的每个值附一个初值
        for(int i = 0; i < n;i++){
            for(int j = 0; j < m;j++){
                for(int k = 0; k < 6;k++){
                    dp[i][j][k] = m * n + 1;  //  注意,不可以赋值为Integer.MAX_VALUE,加减之后会出现负值
                }
            }
        }

        for(int i = 0; i < n; i++){
            String temp = reader.nextLine();
            for(int j = 0; j < m;j++){
                if(temp.charAt(j) == 'S'){
                    Node node = new Node(i,j);
                    for(int k = 0; k < 6;k++){
                        dp[i][j][k] = 0;
                    }
                    queue.add(node);
                }
                else if(temp.charAt(j) == 'E'){
                    end_x = i;
                    end_y = j;
                }
                strChar[i][j] = temp.charAt(j);
            }
        }

        //  广度优先搜索,寻找到达终点经过的最少的步数
        while(!queue.isEmpty()){
            Node node = queue.poll();
            int x = node.node_x;
            int y = node.node_y;
            //  上下左右走,相同k更新
            for(int i = 0; i < 4;i++){
                int temp_x = x + forward[i][0];
                int temp_y = y + forward[i][1];
                if(temp_x >= 0 && temp_x < n && temp_y >= 0 && temp_y < m && strChar[temp_x][temp_y] != '#'){
                    boolean flag = false;
                    for(int k = 0; k < 6;k++){
                        if(dp[temp_x][temp_y][k] > dp[x][y][k] + 1){
                            dp[temp_x][temp_y][k] = dp[x][y][k] + 1;
                            flag = true;
                        }
                    }
                    //  相当于每一个节点的步数重新做了更新,都要重新考虑一遍此节点
                    if(flag){
                        queue.add(new Node(temp_x,temp_y));
                    }
                }
            }
            //  跳跃更新
            if(strChar[n - x - 1][m - y - 1] != '#'){

                boolean flag = false;
                for(int k = 0; k < 5; k++){
                    if(dp[n - x - 1][m - y - 1][k + 1] > dp[x][y][k] + 1){
                        dp[n - x - 1][m - y - 1][k + 1] = dp[x][y][k] + 1;
                        flag = true;
                    }
                }
                if(flag){
                    queue.add(new Node(n - x - 1,n - y - 1));
                }
            }

        }
        if(dp[end_x][end_y][5] != n * m + 1) {
            System.out.println(dp[end_x][end_y][5]);
        }
        else{
            System.out.println(-1);
        }
    }
}


#阿里巴巴笔试3月23号##阿里巴巴##笔试题目#
全部评论
请问第二题题目是啥
点赞 回复 分享
发布于 2020-03-29 14:54
请问有第二题题目吗
点赞 回复 分享
发布于 2020-03-29 13:37

相关推荐

07-25 11:26
清华大学 Java
打开电脑,思绪又回到了7月份刚开始的时候,感觉这个月过的如梦如幻,发生了太多事,也算是丰富了我本就是平淡的人生吧太早独立的我习惯了一切都是自己做决定,拥有绝对的决定权,而且永远不会听取别人的建议。我就是那个恋爱四年出轨的男主啦,感觉既然在牛客开了这个头,那我就要做个有始有终的人。从我出轨到结束再到和女朋友和好如初真的太像一场梦了,短短的一个月我经历了太多,也成长了很多,放下了那些本就不属于我的,找回了那些我不该放弃的。我的人生丰富且多彩,但人不能一直顺,上天总会让你的生活中出点乱子,有好有坏,让你学会一些东西,让你有成长。我和女朋友的恋爱四年太过于平淡,日常除了会制造一些小浪漫之外,我们的生活...
段哥亡命职场:不得不说,我是理解你的,你能发出来足见你是个坦诚的人,至少敢于直面自己的内心和过往的过错。 这个世界没有想象中那样非黑即白,无论是农村还是城市,在看不见的阴影里,多的是这样的事。 更多的人选择站在制高点去谩骂,一方面是社会的道德是需要制高点的,另一方面,很多人不经他人苦,却劝他人善。 大部分的我们,连自己生命的意义尚且不能明晰,道德、法律、困境,众多因果交织,人会迷失在其中,只有真的走出来之后才能看明白,可是没走出来的时候呢?谁又能保证自己能走的好,走的对呢? 可是这种问题有些人是遇不到的,不去追寻,不去探寻,也就没了这些烦恼,我总说人生的意义在过程里,没了目标也就没了过程。 限于篇幅,没法完全言明,总之,这世界是个巨大的草台班子,没什么过不去了,勇敢面对,革故鼎新才是正确,祝你早日走出来。查看图片
点赞 评论 收藏
分享
07-10 14:08
已编辑
江西农业大学 Java
拒绝无效加班的小学生...:期望3k吗?java这辈子有了
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务