笔试题——团队活动分组
2017-09-18 17:38
169 查看
现有n个人,每个人有一个唯一的数字作为标签,标签数字的范围:1~n;为了统计分组情况,有人提议有分组意愿的人提交一个数字,表示其会和以该数字为标签的人分到一组。
现在知道每个人的选择,您能统计出一共有多少个小组吗?
注意:1和2一组,2和3一组,那么1,2,3属于一组。默认为自己一定和自己一组。
输入:
第一行:n(表示n个人,1<=n<=100000)
第二行:n个数(1<=a[i]<=100000)
输出:
输出一个整数,表示最终这些人被分成了多少个小组
样例输入:
5
1 3 4 2 1
样例输出:
2
思路:
比如说有r个分组:1、2、3......r,就把第r组中第一个人(也就是组r中序号最小的一位)的组数设为r,之后该组的所有人的组数都设为和第一个人的一样(相当于没棵树代表一个集合,每个集合中的成员每次都指向根节点);这样,当第i+1个人时,只需看第i个人提交的序号代表的那个人是第几组,就将其改为第几组就行了。那上面示例距离,比如a[2]=3,将其与a[2]=2比较,取最小值,即a[2]=2,那么将a[3]=2。每次都取最小值即可。
代码如下:
现在知道每个人的选择,您能统计出一共有多少个小组吗?
注意:1和2一组,2和3一组,那么1,2,3属于一组。默认为自己一定和自己一组。
输入:
第一行:n(表示n个人,1<=n<=100000)
第二行:n个数(1<=a[i]<=100000)
输出:
输出一个整数,表示最终这些人被分成了多少个小组
样例输入:
5
1 3 4 2 1
样例输出:
2
思路:
比如说有r个分组:1、2、3......r,就把第r组中第一个人(也就是组r中序号最小的一位)的组数设为r,之后该组的所有人的组数都设为和第一个人的一样(相当于没棵树代表一个集合,每个集合中的成员每次都指向根节点);这样,当第i+1个人时,只需看第i个人提交的序号代表的那个人是第几组,就将其改为第几组就行了。那上面示例距离,比如a[2]=3,将其与a[2]=2比较,取最小值,即a[2]=2,那么将a[3]=2。每次都取最小值即可。
代码如下:
import java.util.HashMap; import java.util.Scanner; public class TeamGroup2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n =in.nextInt(); int[] a = new int[n+1]; HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i=1;i<=n;i++){ a[i]=in.nextInt(); } //使得每次都指向根节点 for(int i=1;i<=n;i++){ a[a[i]]=Math.min(i, a[a[i]]); a[i]=Math.min(i, a[a[i]]); if(a[a[i]] < a[i]) a[i]=a[a[i]]; } for(int i=1;i<=n;i++){ System.out.println(a[i]); } for(int i=1;i<=n;i++){ if(!map.containsKey(a[i])) map.put(a[i], i); } System.out.println(map.size()); } }下面思路差不多,另一种写法,可能比较好理解一点:
import java.util.Scanner; public class TeamGroup { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n =in.nextInt(); int[] a = new int[n+1]; int temp=0; int ans=n; for(int i=1;i<=n;i++){ a[i]=i; } for(int i=1;i<=n;i++){ temp=in.nextInt(); ans=Union(i,temp,a,ans); } System.out.println(ans); } private static int Union(int x, int y,int[] a,int an) { int fx = find(x,a); int fy = find(y,a); if(fx < fy) { a[fy] = fx; an--; } else if(fx > fy) { a[fx] = fy; an--; } return an; } private static int find(int x,int[] a) { if(x != a[x]) { a[x] = find(a[x], a); } return a[x]; } }
相关文章推荐
- 去哪儿笔试:身份证分组
- WorkFlow扩展篇Step.2—集合分组下的活动使用[下]-WF4.0
- [VBS]_[活动分组程序]
- 团队分组情况
- [VBS]_[活动分组程序]
- 技术团队工作外娱乐放松活动方案收集
- 12月13日Cocos2d-x引擎团队在线问答活动第三期总结
- 高效从化团队活动方案
- 团队活动 激励还是鸡肋?
- 敏捷个人2011.8月份线下活动报道:高质量催眠睡眠、爱情与生活、敏捷结果团队组建
- 围绕最终交付物,而不是角色,组织软件交付活动:持续交付与跨功能团队
- 【活动公告】传统企业需不需要IT团队——阿朱作客至顶网CIO频道“小崔说事”
- 阿里笔试:天猫超市购物,具有多种购物优惠活动,如:满99减50,满188减100,满288减150等,假设每种商品只能买一次,小明现在支付宝有M元,请问小明如果购物能够使得购物的总价最大?
- 参加公司活动的一些感悟(关于团队的制度)
- 《实时控制软件设计》团队项目分组
- (2015秋) 团队博客及分组情况
- MDCC 2014优秀开发团队征集活动
- 参加公司活动的一些感悟(关于团队的制度)