• 【数据结构与算法笔试】京东0928秋招笔试


    一、小红的矩阵染色

    问题描述:小红拿到了一个矩阵,初始有一些格子被染成了黑色。现在小红希望把最多k个未被染成黑色的格子染成红色,具体的计分方式为是:如果一个红色格子下方相邻的格子也是红色,那么这个红色格子可以得1分。小红想知道,最多可以得到多少分?

    输入描述:

    第一行输入3个正整数,n,m,k分别代表矩阵的行数、列数以及小红最多可以染色的格子数量。
    接下来的n行,每行输入一个长度为m的字符串,用来表示矩阵的初始染色情况,*字符表示黑色,o字符表示白色
    1<=n,m<=1000
    1<=k<=n*m
    
    • 1
    • 2
    • 3
    • 4

    输出描述:

    一个整数,代表小红可以获得的最大分数。
    
    • 1

    样例输入:

    4 4 3
    *o*o
    oooo
    ****
    oooo
    
    • 1
    • 2
    • 3
    • 4
    • 5

    样例输出:

    1
    
    • 1

    参考答案:

    public class 小红的矩阵染色 {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            int n = scanner.nextInt();//行数
            int m = scanner.nextInt();//列数
            int k = scanner.nextInt();//最多染色的格子数量
    
            char[][] grid = new char[n][m];
    
            for (int i=0;i<n;i++){
                String row = scanner.next();
                grid[i] = row.toCharArray();
            }
    
            List<Integer> continueWhite = new ArrayList<>();
            int cnt = 0;
            for(int j = 0;j<m;j++){
                for (int i = 0;i<n;i++){
                    if(grid[i][j] == 'o'){
                        cnt++;
                    }else{
                        continueWhite.add(cnt);
                        cnt = 0;
                    }
                }
                continueWhite.add(cnt);
                cnt = 0;
            }
    
            continueWhite.sort(Collections.reverseOrder());
    
            int point = 0;
            if(continueWhite.get(0) == 1){
                System.out.println(0);
                return;
            }else{
                for(int i = 0;i<continueWhite.size();i++){
                    if(continueWhite.get(i)<k){
                        point = point + continueWhite.get(i)-1;
                        k = k - continueWhite.get(i);
                    }else {
                        point = point + k-1;
                        break;
                    }
                }
            }
            System.out.println(point);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    二、小红的对称串

    问题描述:小红定义一个字符串是轴对称的,当且仅当该字符串反转后和原串相同。
    例如,bod、pwq、ovo等字符串是轴对称的,而ntn不是轴对称的字符串。
    提示:单个轴对称的字母有"ilmnouvwx" ;一对相互轴对称的字母有"pq"、“bd”
    输入描述:

    第一行输入一个正整数n,代表询问次数。
    接下来的n行,每行输入一个仅由小写字母组成的字符串。长度不超过100.
    1<=n<=10
    
    • 1
    • 2
    • 3

    输出描述:

    如果该字符串轴对称,则输出“Yes”。否则输出“No”
    
    • 1

    样例输入:

    2
    bpovoqd
    bbbb
    
    • 1
    • 2
    • 3

    样例输出:

    Yes
    No
    
    • 1
    • 2

    参考答案:

    public class 小红的对称串 {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();//询问次数
            while (n > 0) {
                String str = scanner.next();
                if (isAxialSymmetry(str)) System.out.println("Yes");
                else System.out.println("No");
                n--;
            }
        }
    
        public static boolean isAxialSymmetry(String s) {
            int len = s.length();
            String axialSymmetryString = "ilmnouvwx";
    
            //如果是字符串个数是奇数
            if (len % 2 != 0) {
                if (axialSymmetryString.contains(s.charAt(len / 2) + "")) {
                    for (int i = 0; i < len / 2; i++) {
                        if (s.charAt(i) == 'b' && s.charAt(len - 1 - i) == 'd') {
                            continue;
                        } else if (s.charAt(i) == 'd' && s.charAt(len - 1 - i) == 'b') {
                            continue;
                        } else if (s.charAt(i) == 'p' && s.charAt(len - 1 - i) == 'q') {
                            continue;
                        } else if (s.charAt(i) == 'q' && s.charAt(len - 1 - i) == 'p') {
                            continue;
                        } else if (axialSymmetryString.contains(s.charAt(i) + "") && s.charAt(i) == s.charAt(len - 1 - i)) {
                            continue;
                        }
                        else {
                            return false;
                        }
                    }
                    return true;
                } else {
                    return false;
                }
            }
    
            //如果是字符串个数是偶数
            else {
                for (int i = 0; i < len / 2; i++) {
                    if (s.charAt(i) == 'b' && s.charAt(len - 1 - i) == 'd') {
                        continue;
                    } else if (s.charAt(i) == 'd' && s.charAt(len - 1 - i) == 'b') {
                        continue;
                    } else if (s.charAt(i) == 'p' && s.charAt(len - 1 - i) == 'q') {
                        continue;
                    } else if (s.charAt(i) == 'q' && s.charAt(len - 1 - i) == 'p') {
                        continue;
                    } else if (axialSymmetryString.contains(s.charAt(i) + "") && s.charAt(i) == s.charAt(len - 1 - i)) {
                        continue;
                    }else {
                        return false;
                    }
                }
                return true;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    三、小红的圆构造

    问题描述:
    平面直角坐标系内有一点P,小红希望你构造一个圆满足以下两个条件:
    1.圆和两个坐标轴都相切。
    2.圆经过点P
    显然,一共有两个合法的解,你需要从小到大输出这两个解的圆的半径。

    输入描述:

    两个正整数xp和yp,代表点p的坐标
    
    • 1

    输出描述:

    从小到大两个浮点数,分别代表两个解的圆的半径。
    
    • 1

    样例输入:

    1 2
    
    • 1

    输出:

    1.0000 5.0000
    
    • 1

    参考答案:

    public class 小红的圆构造 {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int xp = scanner.nextInt();
            int yp = scanner.nextInt();
            //求解半径r的方程为r²-2(x+y)r+x²+y²=0
            int a = 1;
            int b = -2 * (xp + yp);
            int c = xp * xp + yp * yp;
            double r1 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
            double r2 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
            System.out.println(r1 + " " + r2);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    PyTorch指定GPU(很受欢迎)
    阿里P8大佬,耗时72小时整理的Docker实战笔记,你值得拥有
    VE成本分析的一次考察
    MySQL binlog集市的项目小结
    面试题:React实现一个Dialog模板
    Spring Initializr私服搭建和定制化模板
    前端入职配置新电脑!!!
    【图像格式篇】可以从网络加载点9图的吗?
    类和对象续
    Visual studio 2019 添加com组件到工具箱提示:下列控件已经成功添加到工具箱中,但未在活动设计器中启用
  • 原文地址:https://blog.csdn.net/weixin_47936614/article/details/134024716