团伙分类:有一份数据部分如下,比如:刘备和关羽有关系,说明他们是一个团伙
题目:
有一份数据部分如下,比如:刘备和关羽有关系,说明他们是一个团伙,刘备和张飞也有关系,那么刘备,关羽,张飞归为一个团伙,以此类推。用自己熟悉的编程语言根据人员和相关人员计算出团伙分类:
人员 | 相关人员 |
---|---|
刘备 | 关羽 |
刘备 | 张飞 |
张飞 | 诸葛亮 |
曹操 | 司马懿 |
司马懿 | 张辽 |
曹操 | 曹丕 |
计算输出结果如下:
人员 | 团伙分类 |
---|---|
刘备 | 1 |
张飞 | 1 |
关羽 | 1 |
诸葛亮 | 1 |
曹操 | 2 |
司马懿 | 2 |
张辽 | 2 |
曹丕 | 2 |
参考答案Java版本:
尝试用Java编程语言实现计算,
import java.util.ArrayList;public class SanGuo {public static void main(String[] args) {ArrayList<Bean> oList = new ArrayList<>();oList.add(new Bean("刘备", "关羽"));oList.add(new Bean("刘备", "张飞"));oList.add(new Bean("张飞", "诸葛亮"));oList.add(new Bean("曹操", "司马懿"));oList.add(new Bean("司马懿", "张辽"));oList.add(new Bean("曹操", "曹丕"));System.out.println("----原数据----");for (Bean Bean : oList) {System.out.println(Bean.getA() + "," + Bean.getB());}ArrayList<Bean> resultList = new ArrayList<>();int number = 1;resultList.add(new Bean(oList.get(0).getA(), number + ""));resultList.add(new Bean(oList.get(0).getB(), number + ""));for (int i = 1; i < oList.size(); i++) {String a = oList.get(i).getA();String b = oList.get(i).getB();boolean boolA = false;boolean boolB = false;String rNumber = "";for (Bean result : resultList) {String name = result.getA();String rNum = result.getB();if (a.equals(name)) {boolA = true;rNumber = rNum;}if (b.equals(name)) {boolB = true;rNumber = rNum;}}if (boolA) {if (boolB) {continue;}resultList.add(new Bean(b, rNumber));}if (!boolA) {if (boolB) {resultList.add(new Bean(a, rNumber));continue;}number++;resultList.add(new Bean(a, number + ""));resultList.add(new Bean(b, number + ""));}}System.out.println("----结果----");for (Bean Bean : resultList) {System.out.println(Bean.getA() + "," + Bean.getB());}}}
class Bean {private String a;private String b;public Bean(String a, String b) {this.a = a;this.b = b;}public String getA() {return a;}public String getB() {return b;}
}
解释如下方:
可能写得不是特别好,这是第1个版本的答案。大体思路如下:
原始数据放进原始数组oList中,单个对象是<人员,相关人员>
,
创建一个结果数组resultList,来存放人员和其所属团伙,单个对象是<人员,团伙编号>
,
Bean是通用的类,它具有两个属性,都是字符串类型的,
<人员,相关人员>
和<人员,团伙编号>
都可以是Bean类型的,
resultList的前2个bean的人员,一定是oList的第1个bean的两个值。
即
oList的第1个bean:
人员 | 相关人员 |
---|---|
刘备 | 关羽 |
resultList的前2个bean:
人员 | 团伙分类 |
---|---|
刘备 | 1 |
关羽 | 1 |
然后我们继续迭代,从oList的第2个bean开始:
for (int i = 1; i < oList.size(); i++) {}
先使用临时变量a和b分别保存oList的第2个bean的人员和相关人员,
又,设置boolA和boolB这两个bool标识。用来标识a和b这两个临时变量是否在结果数组resultList中出现过。
这样,就会出现4中情况了:
- | 有在结果数组中出现过 | 没在结果数组出现过 |
---|---|---|
a | √ | |
a | √ | |
b | √ | |
b | √ |
也就是:
a有
在结果数组中出现过,b有
在结果数组中出现过a有
在结果数组中出现过,b没
在结果数组中出现过a没
在结果数组中出现过,b有
在结果数组中出现过a没
在结果数组中出现过,b没
在结果数组中出现过
这些条件就是上方的代码结构了:
if(boolA){if(boolB) {}if(!boolB) {}
}
if(!boolA) {if(boolB) {}if(!boolB) {}
}
然后~
根据出现的情况,将a或b,单个或同时添加进行结果数组resultList,或都不添加进结果数组数组resultList。
参考答案Python版本:
oList = [Bean("刘备", "关羽"), Bean("刘备", "张飞"), Bean("张飞", "诸葛亮"), Bean("曹操", "司马懿"), Bean("司马懿", "张辽"), Bean("曹操", "曹丕")]print("---原数组---")
for item in oList:print(item.a + ',' + item.b)number = 1
fBean = oList[0].a
sBean = oList[0].b
resultList = [Bean(fBean, number), Bean(sBean, number)]
for i in range(1, len(oList)):oa = oList[i].aob = oList[i].bboolA = FalseboolB = FalserNum = 0for item in resultList:name = item.ateam = item.bif oa == name:boolA = TruerNum = teamif ob == name:boolB = TruerNum = teamif boolA:if boolB:continueresultList.append(Bean(ob, rNum))if not boolA:if boolB:resultList.append(Bean(oa, rNum))if not boolB:number += 1resultList.append(Bean(oa, number))resultList.append(Bean(ob, number))print("---结果数组---")
for item in resultList:print(item.a + ',' + str(item.b))class Bean:def __init__(self, a, b):self.a = aself.b = b
参考答案SQL版本:
此答案由本人同学提供~
create table pop_gg(pop_gg varchar2(3),pop_ggg varchar2(3));truncate table pop_gg;insert into pop_gg(pop_gg,pop_ggg) values('刘备','关羽');
insert into pop_gg(pop_gg,pop_ggg) values('刘备','张飞');
insert into pop_gg(pop_gg,pop_ggg) values('张飞','诸葛亮');
insert into pop_gg(pop_gg,pop_ggg) values('曹操','司马');
insert into pop_gg(pop_gg,pop_ggg) values('司马','张辽');
insert into pop_gg(pop_gg,pop_ggg) values('曹操','曹呸');with tmp as(select pop_gg,pop_ggg,sys_connect_by_path(pop_gg, '/') || '/' || pop_ggg as s,substr(sys_connect_by_path(pop_gg, '/') || '/' || pop_ggg,1,instr(sys_connect_by_path(pop_gg, '/') || '/' || pop_ggg,'/',1,2)) as ssfrom pop_ggstart with pop_gg in(select distinct pop_ggfrom pop_ggwhere pop_gg not in (select pop_ggg from pop_gg)) -- 求出来父级connect by prior pop_ggg = pop_ggunion all -- 拼接父级select distinct pop_gg, pop_gg, '/' || pop_gg || '/', '/' || pop_gg || '/'from pop_ggwhere pop_gg not in (select pop_ggg from pop_gg))
select --pop_gg, pop_ggg,-- ss,dense_rank() over(order by ss asc) as tdfrom tmp;
心得总结:
总之,我们在写算法(或者SQL)之类的程序时,一定要抓哪些变量是不变的,哪些变量是变化的,哪些变量变得快,哪些变量变得慢,这样就可以将核心的问题破解掉。这个也是属于控制变量法的思维,在生活中解决问题时也常常采用这个思维。
团伙分类:有一份数据部分如下,比如:刘备和关羽有关系,说明他们是一个团伙相关推荐
- JavaScript高级day01-AM【WebStrom安装、数据类型分类及判断、数据-内存-变量、引用变量赋值、对象的组成】
笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目 录 P1 01.尚硅谷_JS高级_准备 07:07 WebStrom 下载及安装 1 ...
- Python 实现excel 分类汇总、批量数据替换
目录 需求分析 批量数据替换 根据产品型号进行分类汇总 根据编码进行分类汇总 最近在公司又收到了一个操作excel的项目(我们称为改善项目)特此记录下来,希望对你也有用 需求分析 1.将之前的部分产品 ...
- 同一份数据,Redis为什么要存两次?
欢迎关注方志朋的博客,回复"666"获面试宝典 前言 在 Redis 中,有一种数据类型,当在存储的时候会同时采用两种数据结构来进行分别存储,那么 Redis 为什么要这么做呢?这 ...
- R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、基于自定义函数构建xgboost文本分类模型
R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.基于自定义函数构建xgboost文本分类模型 目录
- R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据、并自定义因子(factor)的图例颜色legend
R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据.并自定义因子(factor)的图例颜色legend(use heatmap to visuali ...
- R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布
R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.xgboost模型预测推理并使用混淆矩阵评估模型.可视化模型预测的概率分布 目录
- hdfs du命令是算的一份数据
As you can see, hadoop fsck and hadoop fs -dus report the effective HDFS storage space used, i.e. th ...
- 使用Sci-kit学习和XGBoost进行多类别分类:使用Brainwave数据的案例研究
by Avishek Nag (Machine Learning expert) 作者:Avishek Nag(机器学习专家) 使用Sci-kit学习和XGBoost进行多类别分类:使用Brainwa ...
- 淘宝关键词搜索商品接口分析商品价格走势(商品列表接口,商品销量接口,商品价格接口,分类ID采集商品数据接口)接口代码对接教程
淘宝关键词搜索商品接口分析商品价格走势(商品列表接口,商品销量接口,商品价格接口,分类ID采集商品数据接口)接口代码对接教程如下: 1.公共参数 名称 类型 必须 描述(接口教程wx199701080 ...
最新文章
- 移动端页面不需要在meta加_移动端适配viewport缩放方案
- 数据结构设计_合并多种疾病,如何设计数据结构?
- Linux学习总结(4)——Centos6.5使用yum安装mysql——快速上手必备
- bash快捷键(防忘)
- Delphi 2009 之 TStringBuilder 类[1]: Create
- 论文笔记_S2D.43_2018-CVPR_单张RGB-D图像的深度补全
- ES6-模块导入导出
- 小甲鱼python课后习题及答案
- 联网时浏览器跳出MSN中国
- 调通sina33下的AP6212A0(WIFI+BT)(V1.1版本)
- epub编辑器apk_使用您喜欢HTML编辑器编辑ePub电子书
- easy connect无法卸载干净,后台sangfor文件一直在运行的卸载方法
- SpringSecurity 密码加密
- Linux命令调整显存,nVidia多显卡多GPU在Linux下的超频设置
- linux vmware 共享文件夹共享,解决vmware上使用linux虚拟,无法共享文件的问题
- 互联网产业中“外行领到内行”和软件工程
- 面向对象设计的3个基本特征和5个原则
- FMS Dev Guide学习笔记(验证客户端)
- MATLAB机器人仿真:利用Simscape Multibody显示真实三维仿真模型
- myBatis之update操作的注意事项
热门文章
- 学生管理系统:含注册登录操作
- php 自定义图片排版,照片拼图在线制作 自带多种照片拼图模板,自由排版将多张照片合成一张...
- 住房公积金联名卡密码修改步骤
- R语言-用R眼看琅琊榜小说的正确姿势
- c# DGV导出excel 使用object类型数组,解决string类型需双击后或分列才可运算的异常
- Markdownpad2报错: Html Rendering Error (An error occurred with the Html rendering component.)
- 一个简单的保护视力的软件
- 【Arduino】Arduino UNO入门
- kubekey搭建K8s集群与kubeSphere容器云管理平台实战
- 怕麻烦的人,过不了好生活,好真实