2023-06-18:给定一个长度为N的一维数组scores, 代表0~N-1号员工的初始得分,
scores[i] = a, 表示i号员工一开始得分是a,
(资料图)
给定一个长度为M的二维数组operations,
operations[i] = {a, b, c}。
表示第i号操作为 :
如果a==1, 表示将目前分数
如果a==2, 表示将编号为b的员工,分数改成c,
所有操作从0~M-1, 依次发生。
返回一个长度为N的一维数组ans,表示所有操作做完之后,每个员工的得分是多少。
1 <= N <= 10的6次方,
1 <= M <= 10的6次方,
0 <= 分数 <= 10的9次方。
来自TikTok美国笔试。
答案2023-06-18:
具体步骤如下:1.创建一个长度为N的一维数组scores
,表示每个员工的初始得分。
2.创建一个长度为M的二维数组operations
,表示操作序列。
3.定义一个函数operateScores2
来处理操作序列。
4.初始化一个节点数组nodes
,用于存储每个员工的节点信息。
5.初始化一个空的得分和桶的映射表scoreBucketMap
。
6.遍历scores
数组,为每个得分值创建一个桶,并将对应的员工节点添加到桶中。
7.遍历operations
数组,处理每个操作。
8.对于类型为1的操作,获取小于当前得分的最大得分值floorKeyV
,然后将它们的桶合并到新的得分值对应的桶中。
9.对于类型为2的操作,获取该员工节点,并将其从原来的桶中移除,然后添加到新的得分值对应的桶中。
10.遍历得分和桶的映射表scoreBucketMap
,将桶中的员工节点按照顺序取出,更新到结果数组ans
中。
11.返回最终的结果数组ans
。
12.进行功能测试和性能测试。
时间复杂度分析:
遍历scores
数组并创建桶,时间复杂度为O(N)。
遍历operations
数组,每个操作的时间复杂度为O(logN)(由于使用了有序映射表来实现桶,检索操作的时间复杂度为O(logN))。
遍历得分和桶的映射表scoreBucketMap
,每个桶中的员工节点数量为O(1),遍历的时间复杂度为O(N)。
总体时间复杂度为O(N + KlogN),其中K为操作序列的长度。
空间复杂度分析:
创建一个长度为N的数组scores
,空间复杂度为O(N)。
创建一个长度为M的数组operations
,空间复杂度为O(M)。
创建一个长度为N的节点数组nodes
,空间复杂度为O(N)。
创建一个有序映射表scoreBucketMap
,储存每个得分值对应的桶,空间复杂度为O(N)。
结果数组ans
的长度为N,空间复杂度为O(N)。
总体空间复杂度为O(N + M)。
go完整代码如下:package mainimport ("fmt""math/rand""time")// 桶,得分在有序表里!桶只作为有序表里的value,不作为keytype Bucket struct {head *Nodetail *Node}func NewBucket() *Bucket {head := &Node{index: -1}tail := &Node{index: -1}head.next = tailtail.last = headreturn &Bucket{head: head, tail: tail}}func (b *Bucket) add(node *Node) {node.last = b.tail.lastnode.next = b.tailb.tail.last.next = nodeb.tail.last = node}func (b *Bucket) merge(join *Bucket) {if join.head.next != join.tail {b.tail.last.next = join.head.nextjoin.head.next.last = b.tail.lastjoin.tail.last.next = b.tailb.tail.last = join.tail.lastjoin.head.next = join.tailjoin.tail.last = join.head}}// Node represents a node in the buckettype Node struct {index intlast *Nodenext *Node}func (n *Node) connectLastNext() {n.last.next = n.nextn.next.last = n.last}// 暴力方法func operateScores1(scores []int, operations [][]int) []int {n := len(scores)ans := make([]int, n)copy(ans, scores)for _, op := range operations {if op[0] == 1 {for i := 0; i < n; i++ {ans[i] = max(ans[i], op[1])}} else {ans[op[1]] = op[2]}}return ans}// 正式方法func operateScores2(scores []int, operations [][]int) []int {n := len(scores)nodes := make([]*Node, n)scoreBucketMap := make(map[int]*Bucket)for i := 0; i < n; i++ {nodes[i] = &Node{index: i}if _, ok := scoreBucketMap[scores[i]]; !ok {scoreBucketMap[scores[i]] = NewBucket()}scoreBucketMap[scores[i]].add(nodes[i])}for _, op := range operations {if op[0] == 1 {floorKeyV := floorKey(scoreBucketMap, op[1]-1)if floorKeyV != -1 && scoreBucketMap[op[1]] == nil {scoreBucketMap[op[1]] = NewBucket()}for floorKeyV != -1 {scoreBucketMap[op[1]].merge(scoreBucketMap[floorKeyV])delete(scoreBucketMap, floorKeyV)floorKeyV = floorKey(scoreBucketMap, op[1]-1)}} else {cur := nodes[op[1]]cur.connectLastNext()if scoreBucketMap[op[2]] == nil {scoreBucketMap[op[2]] = NewBucket()}scoreBucketMap[op[2]].add(cur)}}ans := make([]int, n)for score, bucket := range scoreBucketMap {cur := bucket.head.nextfor cur != bucket.tail {ans[cur.index] = scorecur = cur.next}}return ans}func floorKey(m map[int]*Bucket, target int) int {for score := range m {if score <= target {return score}}return -1}func max(a, b int) int {if a > b {return a}return b}// RandomScores generates an array of random scoresfunc randomScores(n, v int) []int {scores := make([]int, n)rand.Seed(time.Now().UnixNano())for i := 0; i < n; i++ {scores[i] = rand.Intn(v)}return scores}// RandomOperations generates a 2D array of random operationsfunc randomOperations(n, m, v int) [][]int {operations := make([][]int, m)rand.Seed(time.Now().UnixNano())for i := 0; i < m; i++ {operations[i] = make([]int, 3)if rand.Float32() < 0.5 {operations[i][0] = 1operations[i][1] = rand.Intn(v)} else {operations[i][0] = 2operations[i][1] = rand.Intn(n)operations[i][2] = rand.Intn(v)}}return operations}// IsEqual checks if two arrays are equalfunc isEqual(arr1, arr2 []int) bool {if len(arr1) != len(arr2) {return false}for i := 0; i < len(arr1); i++ {if arr1[i] != arr2[i] {return false}}return true}// Main function for testingfunc main() {N := 1000M := 1000V := 100000testTimes := 100fmt.Println("功能测试开始")for i := 0; i < testTimes; i++ {n := rand.Intn(N) + 1m := rand.Intn(M) + 1scores := randomScores(n, V)operations := randomOperations(n, m, V)ans1 := operateScores1(scores, operations)ans2 := operateScores2(scores, operations)if !isEqual(ans1, ans2) {fmt.Println("出错了!")}}fmt.Println("功能测试结束")fmt.Println("性能测试开始")n := 100000m := 100000v := 100000000scores := randomScores(n, v)operations := randomOperations(n, m, v)fmt.Println("总人数:", n)fmt.Println("操作数:", n)fmt.Println("值范围:", v)start := time.Now()operateScores2(scores, operations)end := time.Now()fmt.Println("运行时间:", end.Sub(start))fmt.Println("性能测试结束")}
c++完整代码如下:#include #include #include
关键词:
(责任编辑:黄俊飞)推荐内容
- 最新:2023-06-18:给定一个长度为N的一
- 天天微动态丨个体工商户专场再启!河南省
- “我是一个无助的父亲”杭州辅警收到一封
- 脱发用什么样的洗发水比较好?【阻击脱发
- 中信证券:市场正处波动谷底 配置业绩为
- 朝辞白帝彩云间全诗_朝辞白帝彩云间|每日
- 堵!这地网约车街头排长龙,市民出行受影
- 宝马发布限量版8系列M850i xDrive第一版
- 成立一周年,苏创投发起成立全新千亿基金
- 第五届中国西藏旅游文化国际博览会聚焦青
- 世界观察:数字赋能职业教育 2023重庆职
- 中央气象台继续发布暴雨黄色预警:预计湖
- 南昌塘山镇综合行政执法办“拖延式”执法
- 弗洛伊德之死三年后 美警察系统暴力执法
- 【世界快播报】敲诈勒索罪跟诈骗罪有哪些
- 2023莆田中小学暑假放假时间最新 什么时
- 动态桌面壁纸 全屏会动_电脑桌面动态壁
- 男子受托帮邻居接小孩 孩子路上溺亡 法
- 吸甲醛最快最有效方法不花钱(吸甲醛最好
- 加密支付提供商 Wyre 将关闭,用户可在
- 世界讯息:优化平台协议规则专项行动开展
- 焦点滚动:刘昊然和周冬雨的电影 周冬雨
- 订书机怎么拆开 订书机卡住了怎么拆开
- 果农田老汉的“春天”_全球时快讯
- 冰粉品牌哪个最好_哪个牌子的冰粉粉好一些
- Factory_Reset是什么意思 世界速读
- c50w-20机油(c50的全合成机油多久换?)
- BJ60家玩大会来到广州&成都,长途自驾第
- 机场回应航班取消未告知乘客:航司起飞前
- 早上起来口干口苦是什么原因_为什么早上
- 老师跳下十米高桥救起轻生女子,十年前他
- 世界观焦点:幻想的图标_怎样点亮QQ自由
- 十堰市一项目入选全国废弃矿山生态修复示
- 福城街道桔塘社区召开征兵工作推进会
- 高质量发展调研行·福建站丨东南汽车城:
- 警惕!高温中暑,严重可致死!医生紧急提
- 我国综合立体交通网持续完善 交通物流保
- 罗马诺:切尔西有意塞尔塔中场维加,已询
- 今日热文:郸城房价最新房价格表_鲅鱼圈
- 【全球播资讯】服务实体经济 服务消费
- 新冠多价疫苗已过时?美国FDA最新建议:
- 休闲装女装套装 休闲装女装-全球报资讯
- 公司行政处罚决定书_公司员工处罚决定书
- 华为手机怎么开启运营商名称(华为手机如
- 视点!坚持绿色发展,擦亮生态底色 让更
- 比亚迪首次以专馆参展粤港澳大湾区国际汽
- 人山人海!今天,半个昆明城的人都在往这
- 关于宋喆律师是谁 邵亚光个人资料背景遭
- 司法岛事件是多少集开始 司法岛事件是多
- 全球新动态:武器大师 出装_武器大师出
- 要闻:长城汽车申请GPT相关商标
- 迪拜“还珠格格”大婚,新郎是堂哥?穿高
- 环球观察:第十八届中国国际中小企业博览
- 广东省立中山图书馆新主题馆明日开馆
- 柳林非遗 “遗”彩纷呈
- 主题酒店瑜伽球是什么意思(主题酒店瑜伽
- 易方达中证1000指数量化增强型证券投资基
- 天天百事通!同济科技(600846):6月16
- 江西分享农业发展有限公司_关于江西分享
- 当前视点!衡组词 侮组词
- 世界讯息:优化平台协议规则专项行动开展
- 焦点滚动:刘昊然和周冬雨的电影 周冬雨
- 订书机怎么拆开 订书机卡住了怎么拆开
- 果农田老汉的“春天”_全球时快讯
- 冰粉品牌哪个最好_哪个牌子的冰粉粉好一些
- Factory_Reset是什么意思 世界速读
- c50w-20机油(c50的全合成机油多久换?)
- BJ60家玩大会来到广州&成都,长途自驾第
- 机场回应航班取消未告知乘客:航司起飞前
- 早上起来口干口苦是什么原因_为什么早上
- 老师跳下十米高桥救起轻生女子,十年前他
- 世界观焦点:幻想的图标_怎样点亮QQ自由
- 十堰市一项目入选全国废弃矿山生态修复示
- 福城街道桔塘社区召开征兵工作推进会
- 高质量发展调研行·福建站丨东南汽车城:
- 警惕!高温中暑,严重可致死!医生紧急提
- 我国综合立体交通网持续完善 交通物流保
- 罗马诺:切尔西有意塞尔塔中场维加,已询
- 今日热文:郸城房价最新房价格表_鲅鱼圈
- 【全球播资讯】服务实体经济 服务消费
- 新冠多价疫苗已过时?美国FDA最新建议:
- 休闲装女装套装 休闲装女装-全球报资讯
- 公司行政处罚决定书_公司员工处罚决定书
- 华为手机怎么开启运营商名称(华为手机如
- 视点!坚持绿色发展,擦亮生态底色 让更
- 比亚迪首次以专馆参展粤港澳大湾区国际汽
- 人山人海!今天,半个昆明城的人都在往这
- 关于宋喆律师是谁 邵亚光个人资料背景遭
- 司法岛事件是多少集开始 司法岛事件是多
- 全球新动态:武器大师 出装_武器大师出
- 要闻:长城汽车申请GPT相关商标
- 迪拜“还珠格格”大婚,新郎是堂哥?穿高
- 环球观察:第十八届中国国际中小企业博览
- 广东省立中山图书馆新主题馆明日开馆
- 柳林非遗 “遗”彩纷呈
- 主题酒店瑜伽球是什么意思(主题酒店瑜伽
- 易方达中证1000指数量化增强型证券投资基
- 天天百事通!同济科技(600846):6月16
- 江西分享农业发展有限公司_关于江西分享
- 当前视点!衡组词 侮组词
- 环球新消息丨深桑达A(000032):6月16
- 石集乡扎实做好“安全生产月”宣传教育工
- 枯枝牡丹节_关于枯枝牡丹节概略|世界新要
- 实时焦点:尾骨疼是怎么回事女性_尾骨
- 【报资讯】到底卖队了!乔丹确定出售黄蜂
- 全球报道:V观财报|皇氏集团及董事长等被
- 中国大学慕课官网登录入口 中国大学謩课网
- 【大型】澄海上华这10宗抢手地块即将挂牌
- 寻甸县联合乡“三举措”全面推动团组织发
- 618,宗申高歌猛进惊艳亮相大西北!展现
- 5月70城新建住宅价格环比上涨城市个数减
- 香蕉皮能做花肥吗 香蕉皮能泡水浇花吗?
- 每日热点:全线飘红!“首批扩募上市”
- 美少女惊悚逃生游戏《多愁善感死亡轮回》
- 【天天时快讯】北京朝阳区“阅读大运河”
- 葫芦岛一地,高温红色预警!
- 云南省气象局发布2023年中考天气预报
- 文安县气象台更新高温橙色预警【Ⅱ级/严
- 久久尊享终身寿险怎么样 有什么保障
- 我发现互联网工作的性价比还在持续走低,