JAVA-2018jd秋招编程题

2018jd秋招两道编程题如下:

第一道

给定一张包含N个点、M条边的无向图,每条边连接两个不同的点,且任意两点间最多只有一条边。对于这样的简单无向图,如果能将所有点划分成若干个集合,使得任意两个同一集合内的点之间没有边相连,任意两个不同集合内的点之间有边相连,则称该图为完全多部图。现在你需要判断给定的图是否为完全多部图。
思路:
1、采用邻接矩阵封装数据;
2、通过节点的度来判断是否达到要求;
3、题中的同一集合中没有相连边,不同集合中的节点有边相连。=》同一集合中各节点度的度必须相等,且节点互不相连。。

输入: 第一行表示数据的组数(即图的个数),第二行表示 N个节点及采用节点表示的边的条数M。例如 2 3表示节点2和节点3之间有一条边。
number
N M
.
.
N M
.
.
输出:表示输入的图是否为完全多部图
YES | NO

import java.util.Scanner;
public class MainFirst {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt();
        //遍历多个图
        while (T > 0) {
            //遍历某个图的数据
            //图的节点数
            int N = scan.nextInt();
            //图的边数
            int M = scan.nextInt();
            //X, Y表示节点
            int X, Y;
            //通过邻接矩阵来表示图
            int[][] edge = new int[N + 1][N + 1];
            //通过遍历来填充链接矩阵中的元素
            for (int i = 0; i < M; i++) {
                X = scan.nextInt();
                Y = scan.nextInt();
                //无向图是一个对称阵
                edge[X][Y] = 1;
                edge[Y][X] = 1;
            }
            //判断
            String s = isCover(edge, N);
            //输出结果
            System.out.println(s);
            T--;
        }
    }
    //判断是否为完全多部图
    public static String isCover(int[][] edge, int N) {
        String s = "Yes";
        //计算各节点的度
        int[] sum = new int[N + 1];
        //通过对邻接矩阵的列求和可以得到对应节点的 度
        for (int i = 1; i < N + 1; i++) {
            for (int j = 1; j < N + 1; j++) {
                sum[i] += edge[i][j];
            }
        }
        //遍历所有可能相连的节点,通过排除与题意矛盾的情况的到最后的正确答案
        for (int i = 1; i < N + 1; i++) {
            for (int j = 1; j < N + 1; j++) {
                //若节点不相连 =》 必须在同一集合中
                if (edge[i][j] == 0) {
                    //同一集合,如果度不相等也就意味这 j可以连接的节点(其它集合中),i无法连接,
                    //这与题意中:任意两个不同集合内的点之间有边相连。相矛盾
                    if (sum[j] != sum[i])
                        s = "No";
                }
            }
        }
        return s;
    }
}

第二道

现有n个物品,每个物品有三个参数 ai , bi , ci ,定义i物品不合格品的依据是 : 若存在物品 j , 且aj>ai , bj>bi ,cj>ci,则称i物品为不合格品。 现给出n个物品的a,b,c参数,请你求出不合格品的数量。

输入: 第一行数据为物品的数目n;接下来n行数据为n个物品的三个参数 a b c
3
1 2 3
7 6 5
3 6 7
输出:产品的不合格数
1

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class MainSecond {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n = Integer.parseInt(cin.nextLine());
        //保存物品的格式<编号,a-b-c>
        Map<Integer, String> goods = new HashMap<Integer, String>();
        // 保存物品
        for (int i = 0; i < n; i++) {
            String[] params = cin.nextLine().split(" ");
            goods.put(i, params[0] + "-" + params[1] + "-" + params[2]);
        }
        //不合格的物品数量
        int count = 0;
        // 比较物品
        for (int i = 0; i < n; i++) {
            //得到需要判断的物品的三个参数
            String[] params = goods.get(i).split("-");
            //将需要判断的物品参数与其余的物品参数进行比较
            for (int j = 0; j < n; j++) {
                //表示比较与被比较的物品为同一物品,则继续循环
                if (j == i) {
                    continue;
                }
                String[] p = goods.get(j).split("-");
                //根据题意判断物品是否合格,不合格则直接跳出 
                if (Integer.parseInt(params[0]) < Integer.parseInt(p[0])
                        && Integer.parseInt(params[1]) < Integer.parseInt(p[1])
                        && Integer.parseInt(params[2]) < Integer.parseInt(p[2])) {
                    count++;
                    break;
                }
            }
        }
        //输出不合格数目
        System.out.println(count);
    }
}

猜你喜欢

转载自blog.csdn.net/CTPeng/article/details/82564206
今日推荐