2013-07-02 3 views
1

Я написал код для кругового буфера для вопроса интервью. Но, как это случилось, прошло два тестовых теста, а другие потерпели неудачу. Неисправность причины: индексный диапазон 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

Я думаю, что вы делаете это излишне сложным для себя этим бизнесом 'self .__ class__'. – NPE

+0

@NPE, я должен согласиться с вами. Я новичок в Python, и присвоение класса другому мне очень понравилось. На самом деле я влюблен в Python .. :)! Если бы был лучший способ, я был бы очень признателен за вашу помощь! –

+0

У нас даже меньше шансов придумать подходящий тестовый пример, чем вы уже знакомы с вашим кодом ... – millimoose

ответ

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

+0

Я польщен :) Эти слова настолько общие или здравый смысл, на мой взгляд, что они не нуждаются в тщательной атрибуции. Я определенно повторяю бесчисленное количество инженеров, которые говорили то же самое передо мной. – 9000

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) 
Смежные вопросы