2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出。如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接
2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出。如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接收并打印完。请设计这种接收并打印的结构。
福大大 答案2021-06-20:
头map,尾map,单链表。
时间不够,请直接看代码。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
// MessageBox only receive 1~N
box := NewMessageBox()
// 1....
fmt.Println("这是2来到的时候")
box.receive(2, "B") // - 2"
fmt.Println("这是1来到的时候")
box.receive(1, "A") // 1 2 -> print, trigger is 1
box.receive(4, "D") // - 4
box.receive(5, "E") // - 4 5
box.receive(7, "G") // - 4 5 - 7
box.receive(8, "H") // - 4 5 - 7 8
box.receive(6, "F") // - 4 5 6 7 8
box.receive(3, "C") // 3 4 5 6 7 8 -> print, trigger is 3
box.receive(9, "I") // 9 -> print, trigger is 9
box.receive(10, "J") // 10 -> print, trigger is 10
box.receive(12, "L") // - 12
box.receive(13, "M") // - 12 13
box.receive(11, "K") // 11 12 13 -> print, trigger is 11
}
type Node struct {
info string
next *Node
}
type MessageBox struct {
headMap map[int]*Node
tailMap map[int]*Node
waitPoint int
}
func NewMessageBox() *MessageBox {
ans := &MessageBox{}
ans.headMap = make(map[int]*Node)
ans.tailMap = make(map[int]*Node)
ans.waitPoint = 1
return ans
}
// 消息的编号,info消息的内容, 消息一定从1开始
func (this *MessageBox) receive(num int, info string) {
if num < 1 {
return
}
cur := &Node{info: info}
// num~num
this.headMap[num] = cur
this.tailMap[num] = cur
// 建立了num~num这个连续区间的头和尾
// 查询有没有某个连续区间以num-1结尾
if _, ok := this.tailMap[num-1]; ok {
this.tailMap[num-1].next = cur
delete(this.tailMap, num-1)
delete(this.headMap, num)
}
// 查询有没有某个连续区间以num+1开头的
if _, ok := this.headMap[num+1]; ok {
cur.next = this.headMap[num+1]
delete(this.tailMap, num)
delete(this.headMap, num+1)
}
if num == this.waitPoint {
this.print2()
}
}
func (this *MessageBox) print2() {
node := this.headMap[this.waitPoint]
delete(this.headMap, this.waitPoint)
for node != nil {
fmt.Print(node.info + " ")
node = node.next
this.waitPoint++
}
delete(this.tailMap, this.waitPoint-1)
fmt.Println()
}
执行结果如下:

2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出。如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接的更多相关文章
- 面试题: 已知一个含有n个不同元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的)
TX面试题2: 已知一个含有n个元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的) 题目分析, 为了便于说明,不妨将问题简化一下: 已知一个盒子中有n个不同的球,分别标记为{a1,a2,. ...
- 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。
题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法 ...
- 已知一个字符串S 以及长度为n的字符数组a,编写一个函数,统计a中每个字符在字符串中的出现次数
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 21:04 * @description ...
- 已知一个正整数m,编写一个程序求m的反序数(待消化)
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/5 21:08 * @description ...
- java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义
package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...
- 已知一个序列A1.A2….An,给你一个整数K,找到满足所有Ai+Aj>=k的数对(i,j)的个数
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100010 /* 已知一个序 ...
- poj1190,DFS/已知一个等式,求另一个最小值
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱. ...
- 已知一个日期和天数, 求多少天后的日期(是那个超时代码的AC版)
#include <stdio.h> #include <string.h> ; int judge_year(int x) { == || x % == && ...
- 已知一个数组a[N]来构造数组b[N]的有趣算法题
给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i].在构造过程要求满足:1.不使用除法:2.O(1)空间复杂度和O(n)时间复杂度:3.除 ...
- <每日一题>题目30:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来
def select_d(list,d): # list = sorted(list) sum = {} for i in list: if i+d in list: sum[i] = i+d ret ...
随机推荐
- Switch问题
package com.company;public class Main { public static void main(String[] args) { Income[] incomes = ...
- MAC范洪攻击-macof
macof 目的:攻击交换机的路由表,实现网络信息嗅探 macof是dsniff中的一个小工具 概要:交换机中存在着一个记录着MAC地址的表,为了完成数据的快速转发,这个表有着自动学习机制,学习后可以 ...
- Vue前端框架的基础学习,为之后打个基础
Vue 首先,在使用vue之前,我们需要先下载好一个vue.js文件,才能继续进行vue的学习,下载教程如下: 1.进入官网:https://v2.vuejs.org/ 2.选择页面中的Learn,再 ...
- 陈大好:持续创造小而美的产品丨独立开发者 x 开放麦
本文内容来自RTE NG-Lab 计划中「独立开发者 x 开放麦」活动分享,分享嘉宾独立开发者 @陈大好. 本次活动中,来自 W2solo 独立开发者社区的管理员 @Eric Woo 也以<独立 ...
- 数据库相关知识点整理,助力拿到心仪的offer
1. 数据库的事务 1.1 什么是数据库事务? 事务是指一组逻辑上相关的操作,这些操作要么全部完成,要么全部不完成. 事务是数据库管理系统执行过程中的一个逻辑工作单位,是用户定义的一个操作序列,这些操 ...
- leader epoch
更多内容,前往 IT-BLOG leader epoch 代表 Leader 的纪元信息(epoch),初始值为0.每当 Leader 变更一次,leader epoch 的值就会加1,相当于为 Le ...
- Qt连接不上Linux服务器?
目录 1. Qt连接代码 2. 问题分析(按照顺序排除) 2.1 服务器IP是否能被Ping通? 2.2 客户端中的服务器IP和Port是否填写正确? 2.3 Linux的代码处理是否正确? 2.4 ...
- vue之头像管理思路
思路是在vant库中使用插件将上传的头像转码存入数据库中.每个用户存一个,不同用户就有不同的头像了.若数据库中没有头像,那么就给一个默认头像 头像上传后端接口: var express = requi ...
- 浅读-《深入浅出Nodejs》
原书作者:朴灵 https://book.douban.com/subject/25768396/ 这次算是重读 深入浅出Nodejs,了解到很多之前忽略的细节,收获蛮多,这次顺便将其记录分享,对学习 ...
- kubernetes 安装cilium
kubernetes 安装cilium Cilium介绍 Cilium是一个开源软件,用于透明地提供和保护使用Kubernetes,Docker和Mesos等Linux容器管理平台部署的应用程序服务之 ...