JAVA-京东编程题

#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);
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值