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

一、小红的矩阵染色

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

输入描述:

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

输出描述:

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

样例输入:

4 4 3
*o*o
oooo
****
oooo

样例输出:

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);
    }
}

二、小红的对称串

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

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

输出描述:

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

样例输入:

2
bpovoqd
bbbb

样例输出:

Yes
No

参考答案:

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;
        }
    }
}

三、小红的圆构造

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

输入描述:

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

输出描述:

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

样例输入:

1 2

输出:

1.0000 5.0000

参考答案:

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);
    }
}

你可能感兴趣的:(算法程序设计,1024程序员节,算法)