题目:

有一份数据部分如下,比如:刘备和关羽有关系,说明他们是一个团伙,刘备和张飞也有关系,那么刘备,关羽,张飞归为一个团伙,以此类推。用自己熟悉的编程语言根据人员和相关人员计算出团伙分类:

人员 相关人员
刘备 关羽
刘备 张飞
张飞 诸葛亮
曹操 司马懿
司马懿 张辽
曹操 曹丕

计算输出结果如下:

人员 团伙分类
刘备 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

也就是:

  1. a有在结果数组中出现过,b有在结果数组中出现过
  2. a有在结果数组中出现过,b没在结果数组中出现过
  3. a没在结果数组中出现过,b有在结果数组中出现过
  4. 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)之类的程序时,一定要抓哪些变量是不变的,哪些变量是变化的,哪些变量变得快,哪些变量变得慢,这样就可以将核心的问题破解掉。这个也是属于控制变量法的思维,在生活中解决问题时也常常采用这个思维。

团伙分类:有一份数据部分如下,比如:刘备和关羽有关系,说明他们是一个团伙相关推荐

  1. JavaScript高级day01-AM【WebStrom安装、数据类型分类及判断、数据-内存-变量、引用变量赋值、对象的组成】

    笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目   录 P1 01.尚硅谷_JS高级_准备 07:07 WebStrom 下载及安装 1 ...

  2. Python 实现excel 分类汇总、批量数据替换

    目录 需求分析 批量数据替换 根据产品型号进行分类汇总 根据编码进行分类汇总 最近在公司又收到了一个操作excel的项目(我们称为改善项目)特此记录下来,希望对你也有用 需求分析 1.将之前的部分产品 ...

  3. 同一份数据,Redis为什么要存两次?

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 在 Redis 中,有一种数据类型,当在存储的时候会同时采用两种数据结构来进行分别存储,那么 Redis 为什么要这么做呢?这 ...

  4. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、基于自定义函数构建xgboost文本分类模型

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.基于自定义函数构建xgboost文本分类模型 目录

  5. R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据、并自定义因子(factor)的图例颜色legend

    R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据.并自定义因子(factor)的图例颜色legend(use heatmap to visuali ...

  6. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.xgboost模型预测推理并使用混淆矩阵评估模型.可视化模型预测的概率分布 目录

  7. hdfs du命令是算的一份数据

    As you can see, hadoop fsck and hadoop fs -dus report the effective HDFS storage space used, i.e. th ...

  8. 使用Sci-kit学习和XGBoost进行多类别分类:使用Brainwave数据的案例研究

    by Avishek Nag (Machine Learning expert) 作者:Avishek Nag(机器学习专家) 使用Sci-kit学习和XGBoost进行多类别分类:使用Brainwa ...

  9. 淘宝关键词搜索商品接口分析商品价格走势(商品列表接口,商品销量接口,商品价格接口,分类ID采集商品数据接口)接口代码对接教程

    淘宝关键词搜索商品接口分析商品价格走势(商品列表接口,商品销量接口,商品价格接口,分类ID采集商品数据接口)接口代码对接教程如下: 1.公共参数 名称 类型 必须 描述(接口教程wx199701080 ...

最新文章

  1. 移动端页面不需要在meta加_移动端适配viewport缩放方案
  2. 数据结构设计_合并多种疾病,如何设计数据结构?
  3. Linux学习总结(4)——Centos6.5使用yum安装mysql——快速上手必备
  4. bash快捷键(防忘)
  5. Delphi 2009 之 TStringBuilder 类[1]: Create
  6. 论文笔记_S2D.43_2018-CVPR_单张RGB-D图像的深度补全
  7. ES6-模块导入导出
  8. 小甲鱼python课后习题及答案
  9. 联网时浏览器跳出MSN中国
  10. 调通sina33下的AP6212A0(WIFI+BT)(V1.1版本)
  11. epub编辑器apk_使用您喜欢HTML编辑器编辑ePub电子书
  12. easy connect无法卸载干净,后台sangfor文件一直在运行的卸载方法
  13. SpringSecurity 密码加密
  14. Linux命令调整显存,nVidia多显卡多GPU在Linux下的超频设置
  15. linux vmware 共享文件夹共享,解决vmware上使用linux虚拟,无法共享文件的问题
  16. 互联网产业中“外行领到内行”和软件工程
  17. 面向对象设计的3个基本特征和5个原则
  18. FMS Dev Guide学习笔记(验证客户端)
  19. MATLAB机器人仿真:利用Simscape Multibody显示真实三维仿真模型
  20. myBatis之update操作的注意事项

热门文章

  1. 学生管理系统:含注册登录操作
  2. php 自定义图片排版,照片拼图在线制作 自带多种照片拼图模板,自由排版将多张照片合成一张...
  3. 住房公积金联名卡密码修改步骤
  4. R语言-用R眼看琅琊榜小说的正确姿势
  5. c# DGV导出excel 使用object类型数组,解决string类型需双击后或分列才可运算的异常
  6. Markdownpad2报错: Html Rendering Error (An error occurred with the Html rendering component.)
  7. 一个简单的保护视力的软件
  8. 【Arduino】Arduino UNO入门
  9. kubekey搭建K8s集群与kubeSphere容器云管理平台实战
  10. 怕麻烦的人,过不了好生活,好真实