1

我为一个 interviewstreet 问题编写了循环缓冲区的代码。但事实上,两个测试用例通过了,而其他的则失败了。失败原因:索引出f范围。之后我尝试了几个测试用例来重现失败。不幸的是,他们都没有重现错误。这是代码。

实现一个大小为 N 的循环缓冲区。允许调用者追加、删除和列出缓冲区的内容。实施缓冲区以实现每个操作的最大性能。

"A" n - 将以下 n 行附加到缓冲区。如果缓冲区已满,它们将替换旧条目。
"R" n - 删除缓冲区的前 n 个元素。这 n 个元素是当前元素中最早添加的元素。
"L" - 按插入时间的顺序列出缓冲区的元素。
“Q” - 退出。

class circbuffer():

    #initialization
    def __init__(self,size):
            self.maximum=size
            self.data=[]
            self.current=0


    #appending when the buffer is not full
    def append(self,x):
            if len(self.data)==self.maximum:
                    self.current=0
                    self.data[self.current]=x
                    self.current=(self.current+1)%self.maximum
                    self.__class__=bufferfull
            else:
                    self.data.append(x)

    def remove(self,x):
            if self.data:
                    self.data.pop(0)

    def cget(self):
            return self.data

class bufferfull:

    def append(self,x):
            if len(self.data)<self.maximum:
                    self.data.insert(self.current, x)
            else:
                    self.data[self.current]=x
            self.current=(self.current+1)%self.maximum

    def remove(self,x):
            if self.data:
                    if self.current>len(self.data):
                            self.current=0
                    self.data.pop(self.current)

    def cget(self):
            return self.data[self.current:]+self.data[:self.current]
n=input()

buf=circbuffer(n)
outputbuf=[]

while True:
    com=raw_input().split(' ')
    if com[0]=='A':
            n=int(com[1])
            cominput=[]
            for i in xrange(n):
                    cominput.append(raw_input())
            for j in cominput:
                    buf.append(j)
    elif com[0]=="R":
            n=int(com[1])
            for i in range(n):
                    buf.remove(i)
    elif com[0]=="L":
            for i in buf.cget():
                    outputbuf.append(i)
    elif com[0]=="Q":
            break

for i in outputbuf:
    print i

错误指向self.data.pop(self.current)类bufferfull。我无法从采访街的人那里得到测试数据。我正在尝试自己想出测试用例来重现错误。

有什么见解吗?

4

2 回答 2

1

一个错误在这里:

def remove(self,x):
        if self.data:
                if self.current>len(self.data):
                        self.current=0
                self.data.pop(self.current)

如果self.current == len(self.data),您将尝试弹出一个不存在的元素。

作为一般评论,您的实现太复杂了,因此在我的书中得分不会很高(其他人可能会以不同的方式看待这一点)。@9000 对您的问题的评论很好地总结了它:

把事情简单化。当你可以在相同数量的行中直截了当时,不要聪明。您只需要一个头指针、一个尾指针和一个固定大小的列表。你不需要任何花哨的元编程东西。– @9000

于 2013-07-02T19:24:43.657 回答
1

看起来您正在尝试index out of range使用下面的代码停止错误,但您检查的条件是错误的。

if self.current > len(self.data):
    self.current = 0
self.data.pop(self.current)

如果你打电话self.data.pop(len(self.data)),你肯定会得到这个错误,因为列表是 0 索引的。你可能的意思是:

if self.current >= len(self.data):
    self.current = 0
self.data.pop(self.current)
于 2013-07-02T19:24:58.117 回答