我是靠谱客的博主 粗心羊,最近开发中收集的这篇文章主要介绍【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
2016年小米校招笔试第三题(西安站)
3 假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。
假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。
参考解法(Java版):<Q:316190672,欢迎交流>
package XiaoMi;
import java.util.LinkedList;
import java.util.List;
public class test17 {
/*****************************************************************************************
*@Author:guomutian911
* 算法思想:每一对好友为一项,如{1,5},{3,7},{2,5}为三项。第一项中1为项的左值,5为项的右值。
* 用布尔数组b[]标记遍历过的项,因为while循环是跳跃进行的,如上述关系所示,第一项为{1,5},因为
* 第二项中无第一项中元素则跳跃至第三项。算法借助了两个集合:list放遍历过的元素,数组b放项标记。
****************************************************************************************/
public static void main(String[] args) {
int[][] r = { { 1, 5 }, { 3, 5 }, { 4, 5 }, { 1, 4 }, { 5, 6 },
{ 8, 1 }, { 9, 20 }, { 98, 11 }, { 13, 76 }, { 98, 77 },{2,1} };
friends( r);
}
/**
* 根据二维数组输出朋友圈
* @param r 关系数组
* @return void
* */
static void friends(int[][] r) {
boolean[] b = new boolean[r.length]; //标志是否遍历过,并加入朋友圈集合中
int s = r[0][0]; //从第一项左边开始遍历
List<Integer> list = new LinkedList<Integer>(); //插入操作多所以使用LinkedList
boolean flag = true; //判断循环条件是否终止,while停止标记
b[0] = true; //从第一项开始,表示已经遍历过,并加入集合所以设置为true
while (flag) {
list = new LinkedList<Integer>();
list.add(s); //加入一项中的左或右值
for (int j = 0; j < list.size(); j++) {
int key = list.get(j); //从头遍历list
for (int i = 0; i < r.length; i++) {
if (r[i][0] == key) { //从头遍历所有项,分别取其左右值同list中key值比较
if (!list.contains(r[i][1])) { //list中有左边值,无右边值(若用set则不用判断)
list.add(r[i][1]); //加入右边值
}
b[i] = true; //标记该项已遍历
} else if (r[i][1] == key) {
if (!list.contains(r[i][0])) { //list中有右边值,无左边值
list.add(r[i][0]);
}
b[i] = true; //标记该项已遍历
}
}
}
System.out.println(list); //输出一条朋友圈
//while循环为跳跃前进,所以需要对标记数组从头遍历
for (int i = 0; i < b.length; i++) {
if (b[i] == false) {
s = r[i][0]; //如果没有遍历过,则定位到该处
break; //结束for循环,继续上一步while循环
}else if (i == b.length - 1&&allScan(b)) //使用短路与,减少复杂度
flag = false; //停止while循环
}
}
}
/**
* 判断一个boolean数组里面的值是不是全为true
* @param b 接受的数组
* @return boolean 如果数组全为true返回true
* */
static boolean allScan(boolean[] b){
for(int i=0;i<b.length;i++){
if(b[i] == false){
return false;
}
}
return true;
}
}
运行结果:
[1, 5, 4, 8, 2, 3, 6]
[9, 20]
[98, 11, 77]
[13, 76]
最后
以上就是粗心羊为你收集整理的【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。的全部内容,希望文章能够帮你解决【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复