日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。

發(fā)布時(shí)間:2025/1/21 编程问答 41 豆豆

2016年小米校招筆試第三題(西安站)

3?假如已知有n個(gè)人和m對(duì)好友關(guān)系(存于數(shù)字r)。如果兩個(gè)人是直接或間接的好友(好友的好友的好友...),則認(rèn)為他們屬于同一個(gè)朋友圈,請(qǐng)寫程序求出這n個(gè)人里一共有多少個(gè)朋友圈。
假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5個(gè)人,1和2是好友,2和3是好友,4和5是好友,則1、2、3屬于一個(gè)朋友圈,4、5屬于另一個(gè)朋友圈,結(jié)果為2個(gè)朋友圈。
參考解法(Java版):<Q:316190672,歡迎交流> package XiaoMi;import java.util.LinkedList; import java.util.List;public class test17 {/******************************************************************************************@Author:guomutian911* 算法思想:每一對(duì)好友為一項(xiàng),如{1,5},{3,7},{2,5}為三項(xiàng)。第一項(xiàng)中1為項(xiàng)的左值,5為項(xiàng)的右值。* 用布爾數(shù)組b[]標(biāo)記遍歷過(guò)的項(xiàng),因?yàn)閣hile循環(huán)是跳躍進(jìn)行的,如上述關(guān)系所示,第一項(xiàng)為{1,5},因?yàn)? 第二項(xiàng)中無(wú)第一項(xiàng)中元素則跳躍至第三項(xiàng)。算法借助了兩個(gè)集合:list放遍歷過(guò)的元素,數(shù)組b放項(xiàng)標(biāo)記。****************************************************************************************/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);}/*** 根據(jù)二維數(shù)組輸出朋友圈* @param r 關(guān)系數(shù)組* @return void* */static void friends(int[][] r) {boolean[] b = new boolean[r.length]; //標(biāo)志是否遍歷過(guò),并加入朋友圈集合中int s = r[0][0]; //從第一項(xiàng)左邊開始遍歷List<Integer> list = new LinkedList<Integer>(); //插入操作多所以使用LinkedListboolean flag = true; //判斷循環(huán)條件是否終止,while停止標(biāo)記b[0] = true; //從第一項(xiàng)開始,表示已經(jīng)遍歷過(guò),并加入集合所以設(shè)置為truewhile (flag) {list = new LinkedList<Integer>();list.add(s); //加入一項(xiàng)中的左或右值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) { //從頭遍歷所有項(xiàng),分別取其左右值同list中key值比較if (!list.contains(r[i][1])) { //list中有左邊值,無(wú)右邊值(若用set則不用判斷)list.add(r[i][1]); //加入右邊值}b[i] = true; //標(biāo)記該項(xiàng)已遍歷} else if (r[i][1] == key) { if (!list.contains(r[i][0])) { //list中有右邊值,無(wú)左邊值list.add(r[i][0]); }b[i] = true; //標(biāo)記該項(xiàng)已遍歷}}}System.out.println(list); //輸出一條朋友圈//while循環(huán)為跳躍前進(jìn),所以需要對(duì)標(biāo)記數(shù)組從頭遍歷for (int i = 0; i < b.length; i++) {if (b[i] == false) {s = r[i][0]; //如果沒(méi)有遍歷過(guò),則定位到該處break; //結(jié)束for循環(huán),繼續(xù)上一步while循環(huán)}else if (i == b.length - 1&&allScan(b)) //使用短路與,減少?gòu)?fù)雜度f(wàn)lag = false; //停止while循環(huán)}}}/*** 判斷一個(gè)boolean數(shù)組里面的值是不是全為true* @param b 接受的數(shù)組* @return boolean 如果數(shù)組全為true返回true* */static boolean allScan(boolean[] b){for(int i=0;i<b.length;i++){if(b[i] == false){return false;}}return true;} }

運(yùn)行結(jié)果: [1, 5, 4, 8, 2, 3, 6] [9, 20] [98, 11, 77] [13, 76]
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。