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>(); //插入操作多所以使用LinkedListboolean flag = true; //判断循环条件是否终止,while停止标记b[0] = true; //从第一项开始,表示已经遍历过,并加入集合所以设置为truewhile (flag) {list = new LinkedList<Integer>();list.add(s); //加入一项中的左或右值for (int j = 0; j < list.size(); j++) {int key = list.get(j); //从头遍历listfor (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个人里一共有多少个朋友圈。相关推荐

  1. 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    package demo;import java.util.Arrays;/** 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.*/ //num ...

  2. 【C语言】平均分的战争。有m个人的成绩存放在score数组中,请编写程序求出平均成绩并且罗列出低于平均分的分数。

    [问题描述] 平均分的战争.有m个人的成绩存放在score数组中,请编写程序求出平均成绩并且罗列出低于平均分的分数. [输入形式]输入共两行: 第一行成绩个数N,N<=20 第二行,N个以空格分 ...

  3. 算法:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。(异或符号的妙用)

    异或的性质: 1.交换律 2.结合律(即(a^b)^c == a^(b^c)) 3.对于任何数x,都有x^x=0,x^0=x 4.自反性 A XOR B XOR B = A xor  0 = A 算法 ...

  4. 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置

    2016年小米校招笔试第二题(西安站) 2 现有一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置(如1234568,向右移动3次后为67812345). 参考解法(Java版 ...

  5. 【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次

    2016年小米校招笔试第一题(西安站) 1 给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次. 参考解法(Java版): package XiaoMi;/********** ...

  6. 【小米校招笔试】在Excel中,列的名称是这样一个递增序列:seq={A、B、C、... Z、AA、AB、AC、... AZ、BA、BB、BC、... BZ、CA、... ZZ、AAA、AAB...

    2016年小米校招笔试第一题(成都站) 1 在Excel中,列的名称是这样一个递增序列:seq={A.B.C....  Z.AA.AB.AC.... AZ.BA.BB.BC.... BZ.CA.... ...

  7. C语言面试题--已知整形变量在内存中占4个字节的空间,现有一无符号整形变量a = 0x20190125,请编写函数求出变量a所占内存每个字节的值是多少?

    已知整形变量在内存中占4个字节的空间,现有一无符号整形变量a = 0x20190125,请编写函数求出变量a所占内存每个字节的值是多少? 用共用体方法:共用体内的空间是公用的,每一个成员都可以访问共用 ...

  8. 穷举问题-搬砖某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法? 输入格式:

    某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块.如果想用n人正好搬n块砖,问有多少种搬法? 输入格式: 输入在一行中给出一个正整数n. 输出格式: 输出在每一行显示一种方案,按 ...

  9. 某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法

    题目编号: 136 输入格式: 输入在一行中给出一个正整数n. 输出格式: 输出在每一行显示一种方案,按照"men = cnt_m, women = cnt_w, child = cnt_c ...

最新文章

  1. 【Design pattern】简单工厂过渡策略模式
  2. 点云深度学习的Pytorch框架
  3. Selenium 1.0的历史及工作原理
  4. istio入门(05)istio的架构概念2
  5. linux中offsetof与container_of宏定义
  6. 面试官问:上亿数据量下,Kafka是如何优化JVM GC问题的?
  7. c语言font6x8,爱字体下载安卓版-iFont爱字体下载V5.9.8.6 安卓手机版-全新的手机字体软体西西软件下载...
  8. 阿里云飞天论文获国际架构顶会 ATC 2021最佳论文:全球仅三篇
  9. 用python写helloworld_Python Helloworld程序简单实现
  10. 使用T—SQL语句操作数据库
  11. Linux中断(interrupt)子系统之四:驱动程序接口层 中断通用逻辑层
  12. 点击复制,兼容ios-safari
  13. android holder 一定要内部类吗,Android ViewHolder
  14. 怎么选?毕竟可以上网的浏览器只剩下四款了。。。
  15. 如何将PDF图片转变成Word
  16. mariadb数据库基本使用
  17. python 3d绘图旋转_Python:如何围绕z轴旋转曲面并进行三维绘图?
  18. 博士申请 | 香港城市大学刘晨老师组招收机器学习方向全奖博士/博后/硕士/RA...
  19. Because you loved me
  20. flex+java项目创建_创建Flex 4和Java Web应用程序

热门文章

  1. IM推送保障及网络优化详解(二):如何做长连接加推送组合方案
  2. 连接阿里云和容器技术生态 - 阿里云开源容器项目汇总
  3. 安装配置nginx加载concat模块
  4. webform 转 MVC 飞一般的感觉
  5. php SqlServer 中文汉字乱码
  6. 某房产中介服务器托管及安全方案(下)
  7. 从锤子手机谈产品的逼格
  8. [转载] 计算机网络——OSI模型究竟忽悠了多少人
  9. 教徒计划出品:AIM-IPS升级到7.0步骤
  10. 抖音怎么设置保存路径_抖音限时可见视频怎么弄 设置限时可见作品方法