首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“最后100个字节”面试场景

“最后100个字节”面试场景
EN

Stack Overflow用户
提问于 2011-11-03 03:26:34
回答 4查看 5.3K关注 0票数 78

前几天我在一次面试中遇到了这个问题,我想知道一些最好的答案(我回答得不是很好,哈哈):

场景:有一个网页正在监控通过某个网络发送的字节。每次发送一个字节时,都会调用recordByte()函数来传递该字节,这种情况每天可能会发生数十万次。此页面上有一个按钮,按下该按钮时,将在屏幕上显示传递给recordByte()的最后100个字节(它通过调用下面的print方法来完成此操作)。

以下代码是我得到并要求填写的代码:

代码语言:javascript
复制
public class networkTraffic {
    public void recordByte(Byte b){
    }
    public String print() {
    }
}

存储这100个字节的最佳方法是什么?一份清单?好奇如何最好地做到这一点。

EN

回答 4

Stack Overflow用户

发布于 2011-11-03 03:31:53

我不知道java,但是一定有一个队列的概念,你可以把字节排入队列,直到队列中的项数达到100个,这时你可以把一个字节出队,然后再把另一个字节排入队列。

代码语言:javascript
复制
public void recordByte(Byte b)
{ 
  if (queue.ItemCount >= 100)
  {
    queue.dequeue();    
  }
  queue.enqueue(b);
}

您可以通过查看以下项目来打印:

代码语言:javascript
复制
public String print() 
{ 
  foreach (Byte b in queue)
  {
    print("X", b);  // some hexadecimal print function
  }
}  
票数 34
EN

Stack Overflow用户

发布于 2011-11-03 03:30:41

最简单的方法是将其放入数组中。该数组可以容纳的最大大小是100字节。继续添加字节,因为它们是从web上流出的。在前100个字节在数组中之后,当第101个字节到来时,删除头部的字节(即第0个)。继续这样做。这基本上是一个队列。先进先出的概念。下载完成后,剩下最后100个字节。

不仅在下载之后,而且在任何给定的时间点,此数组都将具有最后100个字节。

@Yottagray没有找到问题所在?似乎有许多通用方法(数组、循环数组等)&许多特定于语言的方法(byteArray等)。我是不是遗漏了什么?

票数 4
EN

Stack Overflow用户

发布于 2012-03-09 09:02:28

采用非阻塞I/O的多线程解决方案:

代码语言:javascript
复制
private static final int N = 100;
private volatile byte[] buffer1 = new byte[N];
private volatile byte[] buffer2 = new byte[N];
private volatile int index = -1;
private volatile int tag;

synchronized public void recordByte(byte b) {
  index++;
  if (index == N * 2) {
    //both buffers are full
    buffer1 = buffer2;
    buffer2 = new byte[N];
    index = N;
  }
  if (index < N) {
    buffer1[index] = b;
  } else { 
    buffer2[index - N] = b;
  }
}

public void print() {
  byte[] localBuffer1, localBuffer2;
  int localIndex, localTag;
  synchronized (this) {
   localBuffer1 = buffer1;
   localBuffer2 = buffer2;
   localIndex = index;
   localTag = tag++;
  }
  int buffer1Start = localIndex - N >= 0 ? localIndex - N + 1 : 0;
  int buffer1End = localIndex < N ? localIndex : N - 1;      
  printSlice(localBuffer1, buffer1Start, buffer1End, localTag);
  if (localIndex >= N) {
    printSlice(localBuffer2, 0, localIndex - N, localTag);
  }
}

private void printSlice(byte[] buffer, int start, int end, int tag) {
  for(int i = start; i <= end; i++) {
    System.out.println(tag + ": "+ buffer[i]);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7986186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档