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