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()
}

执行结果如下:


左神java代码

2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出。如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接的更多相关文章

  1. 面试题: 已知一个含有n个不同元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的)

    TX面试题2: 已知一个含有n个元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的) 题目分析, 为了便于说明,不妨将问题简化一下: 已知一个盒子中有n个不同的球,分别标记为{a1,a2,. ...

  2. 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。

    题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法 ...

  3. 已知一个字符串S 以及长度为n的字符数组a,编写一个函数,统计a中每个字符在字符串中的出现次数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 21:04 * @description ...

  4. 已知一个正整数m,编写一个程序求m的反序数(待消化)

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/5 21:08 * @description ...

  5. java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义

    package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...

  6. 已知一个序列A1.A2….An,给你一个整数K,找到满足所有Ai+Aj>=k的数对(i,j)的个数

    #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100010 /* 已知一个序 ...

  7. poj1190,DFS/已知一个等式,求另一个最小值

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.  设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱. ...

  8. 已知一个日期和天数, 求多少天后的日期(是那个超时代码的AC版)

    #include <stdio.h> #include <string.h> ; int judge_year(int x) { == || x % == && ...

  9. 已知一个数组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.除 ...

  10. <每日一题>题目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 ...

随机推荐

  1. Pinia使用技巧

    vue2使用的vuex,是一个状态管理器,现在vue3出了最新的pinia,今年偿试一下. 首先是安装,这里要注意一下,有一个持久化插件,如果不用的话,页面一刷新,状态会消失. npm install ...

  2. Notepad++行转列

    行转列\r\n

  3. 加深印象篇之Servlet

    环境配置 需要配置web.xml文件, <web-app> <servlet> <servlet-name>你起的一个类的名字</servlet-name&g ...

  4. Java Swing的练习感悟

    感悟心得 这还是我第一次使用Java Swing写代码呢,直接就是趣味性拉满! 在相关的界面代码的基础上,在必要的位置嵌入Java代码,就可以很好的实现啦! 简单的嘞! (有兴趣的各位可以选择去浅浅地 ...

  5. C#多线程开发-了解C#5.0 05

    前面一篇文章,了解了任务并行库.这是异步编程基础设施,它允许我们以模块化的方式设计程序,来组合不同的异步操作.解决了以往线程之间传递消息难等问题,但是我们在阅读和编写此类程序时还是会觉得非常难理解程序 ...

  6. php in_array 遍历,in_array大数组查询性能问题

    问题最近在实现一个项目接口的时候发现当数组过大的时候,数据返回的速度有点慢.接口数据返回最长反应时间2s,经过反复调试发现代码段耗时最长的部分在in_array()函数.解决过程在stackoverf ...

  7. 机器学习08DAY

    线性回归 波士顿房价预测案例 步骤 导入数据 数据分割 数据标准化 正规方程预测 梯度下降预测 # 导入模块 import pandas as pd # 导入数据 from sklearn.model ...

  8. 这年头,谁的好友列表还没有躺一个ChatGPT啊?

    你要是说这个,我可不困了 大家好,我最近开始使用一款非常有趣的AI机器人,它叫做ChatGPT.ChatGPT是一款独特的聊天机器人,它可以进行智能对话,回答你的问题,还可以学习你的语言习惯,使得对话 ...

  9. 进程,Process模块,join方法,ipc机制,守护进程

    多道技术: """ 在学习并发编程的过程中 不做刻意提醒的情况下 默认一台计算机就一个CPU(只有一个干活的人) """ 单道技术 所有的程 ...

  10. super 与 this 关键字

    super与this用法相似: 1.普通的直接引用 2.形参与成员名字重名,用 this 来指代类本身,super指代父类 public class Students extends Person { ...