“最后 100 字节”面试场景

2022-08-31 12:56:15

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

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

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

public class networkTraffic {
    public void recordByte(Byte b){
    }
    public String print() {
    }
}

存储 100 个字节的最佳方式是什么?列表?好奇如何最好地做到这一点。


答案 1

像这样的东西(循环缓冲区):

byte[] buffer = new byte[100];
int index = 0;

public void recordByte(Byte b) {
   index = (index + 1) % 100;
   buffer[index] = b; 
}

public void print() {
   for(int i = index; i < index + 100; i++) {
       System.out.print(buffer[i % 100]);
   }
}

使用循环缓冲区的好处:

  1. 您可以静态保留空间。在实时网络应用程序中(VoIP、流,..)这通常是因为您不需要存储传输的所有数据,而只需要存储包含要处理的新字节的窗口。
  2. 它的速度很快:可以用一个读写开销为O(1)的数组来实现。

答案 2

我不懂java,但必须有一个队列概念,你可以将字节排队,直到队列中的项目数达到100,此时你会取消一个字节的队列,然后排队另一个字节。

public void recordByte(Byte b)
{ 
  if (queue.ItemCount >= 100)
  {
    queue.dequeue();    
  }
  queue.enqueue(b);
}

您可以通过偷看这些项目进行打印:

public String print() 
{ 
  foreach (Byte b in queue)
  {
    print("X", b);  // some hexadecimal print function
  }
}