2022-03-27:class AreaResource { String area; // area表示的是地区全路径,最多可能有6级,比如: 中国,四川,成都 或者 中国,浙江,杭州 Str
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)
}
执行结果如下:

2022-03-27:class AreaResource { String area; // area表示的是地区全路径,最多可能有6级,比如: 中国,四川,成都 或者 中国,浙江,杭州 Str的更多相关文章
- 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】
--------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch ...
- 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 题意 在一 ...
- 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)
2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...
- String、StringBuffer与StringBuilder之间区别[全屏看文]
String.StringBuffer与StringBuilder之间区别[全屏看文] 最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,S ...
- 2018/03/27 每日一个Linux命令 之 cron
Cron 用于配置定时任务. -- 环境为 Ubuntu16-04 -- 先说说怎么配置一个简单的定时任务.直观的可以看到效果. 之前在网上查找资料,对Shell编程不熟悉的实在是很头疼,走了不少弯路 ...
- 网易2018.03.27算法岗,三道编程题100%样例AC题解
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8660814.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- javascript总结27 :特殊引用类型String/Number/Boolean
为了方便操作基本数据类型,JavaScript还提供了三个特殊的引用类型:String/Number/Boolean 1 Number 例如: var s1 = "zhangsan&quo ...
- 2019.03.19 读书笔记 string与stringbuilder的性能
1 string与stringbuilder 并不是stringbuilder任何时候都在性能上占优势,在少量(大约个位数)的字符串时,并不比普通string操作快. string慢的原因不是stri ...
- 2019.03.27 读书笔记 关于GC垃圾回收
在介绍GC前,有必要对.net中CLR管理内存区域做简要介绍: 1. 堆栈:用于分配值类型实例.堆栈主要操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放.栈的执行效 ...
- 2016.03.27,英语,《Vocabulary Builder》Unit 06
equ: from Latin aequus, meaning 'equal', equalize:使相等; equivalent:[ɪ'kwɪvələnt], A is equivalent to ...
随机推荐
- day2 java基础语法
day1复习 1.java的特点 2.jdk,jre,jvm的关系 3.为什么要配置path 基本语法 1.关键字与保留字 2.标识符与标识符规则 3.java的命名规范 起名时提高阅读性尽量有意义 ...
- C#的Event事件
一直不明白事件,今天写了一下,做个笔记吧. 先建一个类,里面有一个方法,返回bool型 public class Subject { public bool IsPass(int x) { Conso ...
- [WinUI 3] 如何利用D3D11在SwapChainPanel控件上绘制OpenGL(Uwp通用)
预览 技术实现 看过我上篇在 WPF 中实现 OpenGL 与 D3D 渲染的同学应该知道,我是依靠 WGL 中 WGL_NV_DX_interop 扩展与 D3D Surface 关联并在使用该 S ...
- 百炼成钢 —— 声网实时网络的自动运维丨Dev for Dev 专栏
本文为「Dev for Dev 专栏」系列内容,作者为声网大数据算法工程师黄南薰. 01 自动运维介绍 2016 年,Gartner 创新性地提出了 AIOps 的概念[1],开创了人工智能辅助运维决 ...
- 为什么wait()需要在同步代码块内使用
我们还是通过源代码和代码注释来学习这个问题 我们先来看看wait方法的注释,这里截取最根源的native方法给的注释 Causes the current thread to wait until e ...
- Vue 相关整理
一 谈谈对 keep-alive 的了解? keep-alive 是Vue内置的一个组件,可以使被包含的组件保留状态,避免重新渲染,其有以下特性: * 一般结合路由和动态组件一起使用,用于缓存组件: ...
- node.js解决跨域方案
服务端 1.通过使用cors模块解决跨域问题 var express = require('express') , cors = require('cors') , app = express(); ...
- Lombok首字母小写,第二个字母大写,jackson反序列化失败
记一次接口调用字段映射失败问题排查 在写接口的时候遇到一个很神奇的问题,编写一个post接口,在使用包装类接收body的时候发现有个字段映射不上.代码如下 @RestController public ...
- Web界面元素的测试
文本框 测试点 输入正常的字母或数字 输入超长字符.例如在"名称"框中输入超过允许边界个数的字符,假设最多255个字符,尝试输入256个字符,检查程序能否正确处理 输入默认值,空白 ...
- 介绍ServiceSelf项目
ServiceSelf 做过服务进程功能的同学应该接触过Topshelf这个项目,它在.netframework年代神一搬的存在,我也特别喜欢它.遗憾的是在.netcore时代,这个项目对.netco ...