2022-03-27:class AreaResource {
String area; // area表示的是地区全路径,最多可能有6级,比如: 中国,四川,成都 或者 中国,浙江,杭州
String spliter; // 比如:逗号 -> ,
long count; // 表示地区的门店数量
}
现在需要把 List 进行转换,需要做到同级的地域能合并,
比如:area为中国,四川,成都 ,有10个门店;area为中国,浙江,杭州,有25个门店;area为中国,浙江,义乌,有22个门店,
最终生成的JSON字符串为: {“中国”:{“四川”:{“成都”:10]},“浙江”:{“义乌”:22,“杭州”:25}}}。
请实现下面的方法 public String mergeCount(List areas) 。
来自北京北明数科信息技术有限公司。

答案2022-03-27:

自然智慧。前缀树。

代码用golang编写。代码如下:

package main

import (
"fmt"
"strings"
) func main() {
a1 := NewAreaResource("中国,四川,成都", ",", 10)
a2 := NewAreaResource("中国,浙江,杭州", ",", 50)
a3 := NewAreaResource("中国,浙江,杭州", ",", 25)
a4 := NewAreaResource("中国,浙江,义乌", ",", 22)
a5 := NewAreaResource("中国,四川,成都", ",", 15)
a6 := NewAreaResource("中国,四川,攀枝花", ",", 12)
a7 := NewAreaResource("中国,浙江,宁波", ",", 16) areas := make([]*AreaResource, 0)
areas = append(areas, a1)
areas = append(areas, a2)
areas = append(areas, a3)
areas = append(areas, a4)
areas = append(areas, a5)
areas = append(areas, a6)
areas = append(areas, a7) ans := mergeCount(areas) fmt.Println(ans)
} type AreaResource struct {
area string
spliter string
count int
} func NewAreaResource(a string, s string, c int) *AreaResource {
ans := &AreaResource{}
ans.area = a
ans.spliter = s
ans.count = c
return ans
} // 要实现的方法
func mergeCount(areas []*AreaResource) string {
all := NewArea("", 0)
for _, r := range areas {
// 中国,四川,成都 , 10个门店
//path0 := r.area.split(r.spliter)
path0 := strings.Split(r.area, r.spliter)
// 中国 四川 成都
count := r.count
f(path0, 0, all, count)
}
return all.toString()
} // [中国,四川,成都]
// 0 1 2
func f(path0 []string, index int, pre *Area, count int) {
if index == len(path0) {
pre.count += count
} else {
// 前一个节点 pre 中国
// cur = 四川
cur := path0[index]
if _, ok := pre.next[cur]; !ok {
pre.next[cur] = NewArea(cur, 0)
}
f(path0, index+1, pre.next[cur], count)
}
} // 自己定义的!前缀树节点
type Area struct {
// 地区名称:中国
// 四川
// 成都
name string
// 中国 key : 省名 value: 下级节点
next map[string]*Area
count int
} func NewArea(n string, c int) *Area {
ans := &Area{}
ans.name = n
ans.count = c
ans.next = make(map[string]*Area)
return ans
} func (this *Area) toString() string {
ans := make([]byte, 0)
// : ""
// str = "中国":
// str = "成都":100
if this.name != "" {
ans = append(ans, []byte("\""+this.name+"\""+":")...)
}
if len(this.next) == 0 {
ans = append(ans, []byte(fmt.Sprint(this.count))...)
} else {
// "中国":{ 四川如何如何,河南如何如何,江苏如何如何}
//ans.append("{");
ans = append(ans, []byte("{")...)
for _, child := range this.next {
ans = append(ans, []byte(child.toString()+",")...)
}
ans[len(ans)-1] = '}'
}
return string(ans)
}

执行结果如下:


左神java代码

2022-03-27:class AreaResource { String area; // area表示的是地区全路径,最多可能有6级,比如: 中国,四川,成都 或者 中国,浙江,杭州 Str的更多相关文章

  1. 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】

    --------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch ...

  2. 2022.02.27 CF811E Vladik and Entertaining Flags

    2022.02.27 CF811E Vladik and Entertaining Flags https://www.luogu.com.cn/problem/CF811E Step 1 题意 在一 ...

  3. 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)

    2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...

  4. String、StringBuffer与StringBuilder之间区别[全屏看文]

    String.StringBuffer与StringBuilder之间区别[全屏看文]   最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,S ...

  5. 2018/03/27 每日一个Linux命令 之 cron

    Cron 用于配置定时任务. -- 环境为 Ubuntu16-04 -- 先说说怎么配置一个简单的定时任务.直观的可以看到效果. 之前在网上查找资料,对Shell编程不熟悉的实在是很头疼,走了不少弯路 ...

  6. 网易2018.03.27算法岗,三道编程题100%样例AC题解

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8660814.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  7. javascript总结27 :特殊引用类型String/Number/Boolean

    为了方便操作基本数据类型,JavaScript还提供了三个特殊的引用类型:String/Number/Boolean 1  Number 例如: var s1 = "zhangsan&quo ...

  8. 2019.03.19 读书笔记 string与stringbuilder的性能

    1 string与stringbuilder 并不是stringbuilder任何时候都在性能上占优势,在少量(大约个位数)的字符串时,并不比普通string操作快. string慢的原因不是stri ...

  9. 2019.03.27 读书笔记 关于GC垃圾回收

    在介绍GC前,有必要对.net中CLR管理内存区域做简要介绍: 1. 堆栈:用于分配值类型实例.堆栈主要操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放.栈的执行效 ...

  10. 2016.03.27,英语,《Vocabulary Builder》Unit 06

    equ: from Latin aequus, meaning 'equal', equalize:使相等; equivalent:[ɪ'kwɪvələnt], A is equivalent to ...

随机推荐

  1. 快速掌握Linux三剑客命令使用

    前言 Linux三剑客指的是grep.sed以及awk命令的使用,这三个命令功能异常强大,大到没朋友.grep命令主打"查找",sed命令主打"编辑",awk命 ...

  2. Android进度表示

    在连接上数据库之后,一切都变得简单了呢! 开心,很轻松地就能够将APP里面的相关内容写完啦! 尝试了好久的连接Mysql数据库,最后还是没有成功: 虽然Android studio里面自带的SQLit ...

  3. Spring--AOP通知获取数据

    AOP通知获取数据 获取参数 用before进行举例: 用around进行举例: 需要注意的是,Around的话,还可以处理一些之前发生异常的数据,直接在这里进行修改也是支持的: 获取返回值 环绕已经 ...

  4. pyinstall打包工具使用简介

    使用pyinstall进行多个文件打包,直接打包主入口文件即可 pyinstaller MainUI.py -F -n ServerMonitorv200 -i PIC.ico -w 此处MainUI ...

  5. 保姆级本地maven安装配置步骤【Windows】

    一.前期准备 1.首先需要安装并配置好本地JDK(WIN+R输入cmd,输入java -version如下图) 2.下载maven到本地(链接Maven – Download Apache Maven ...

  6. Day04笔记

    01.explicit的作用(了解) class Maker { public: //explicit只能放在构造函数前面,构造函数只有一个参数或其他参数有默认值时 explicit Maker(in ...

  7. 深入理解 Python 虚拟机:字典(dict)的实现原理及源码剖析

    深入理解 Python 虚拟机:字典(dict)的实现原理及源码剖析 在本篇文章当中主要给大家深入介绍一下在 cpython 当中字典的实现原理,在本篇文章当中主要介绍在早期 python3 当中的版 ...

  8. 第三章3.3 selenium基础

    seleniumIDE:是一款可以实现录制回放的操作:存在可视化窗口进行录制回放操作:它属于firefox(chrome)浏览器的插件;安装方式:两种 : 1.下载安装包离线安装2.在线安装 注意:不 ...

  9. 华为人工智能atlasA800-9000物理服务器离线安装及CANN安装和MindSpore安装和Tensorflow安装

    目录 华为人工智能atlas A800-9000 物理服务器全程离线安装驱动以及CANN安装部署和MindSpore安装部署和Tensorflow安装部署 A800-9000 物理服务器安装驱动 使用 ...

  10. Redis集群介绍及测试思路

    作者:京东零售 李磊 Redis集群介绍 Redis集群一般有四种方式,分别为:主从复制.哨兵模式.Cluster以及各大厂的集群方案.在3.0版本之前只支持单实例模式,3.0之后支持了集群方式.在3 ...