最近的請求次數
阿新 • • 發佈:2020-07-21
題目內容
計算每個事件發生之時,往前算10000毫秒內有多少個事件發生,包含當事件;也即對於列表中的每個元素k,算出整個列表中有多少個元素介於k-10000和k(兩端均含)之間。
輸入樣例
[0,10,100,1000,10000,20000,100000]
輸出樣例
[1,2,3,4,5,2,1]
程式碼
''' 最近的請求次數 ''' ''' 類的實現 ''' class node: # 這裡不用加括號,具體引數都在init函式裡,這也是和函式區別的一部分,函式的升級和高階有序集合 def __init__(self, val, n): # 傳入引數的名字 self.data = val self.next = None # 類的某個元素的名字 self.num = n # 每個節點的預設節點都是指向空的 def getData(self): return self.data def getnext(self): return self.next def getnum(self): return self.num def setData(self, newData): self.data = newData def setNext(self, newNext): self.next = newNext class orderedList: # 只儲存表頭的資訊 def __init__(self): self.head = None # 注意這裡是大寫 def size(self): count = 0 p = self.head while p != None: count = count + 1 p = p.getnext() return count def search(self, content, bos): p = self.head previous = None found = False # 大寫!!有了found這個較為特殊的變數時,程式碼更加易讀清晰 stop = False i = self.size() - 1 while i >= bos and p != None: # 保證從起始節點的下一個節點開始搜尋,而不是從頭開始 previous = p p = p.getnext() i = i - 1 while p != None and not found and not stop: # 分類討論 if p.getData() == content: # 如果相等,直接返回當前節點的序號 return p.getnum() else: if p.getData() < content: # 如果當前節點資料較小,那就返回之前節點的 stop = True # 那麼found肯定等於False, 這樣寫程式碼更加易讀 else: # 大就繼續移動 previous = p p = p.getnext() if previous == None: return p.getnum() else: return previous.getnum() return found def nor(mylist): # num of request Mylist = orderedList() count = 0 l1 = [] l2 = [] for each in mylist: newNode = node(each, count) newNode.setNext(Mylist.head) Mylist.head = newNode # 這裡老是容易搞混 count = count + 1 p = Mylist.head while p != None: temp = p.getData() - 10000 n = Mylist.search(temp, p.getnum()) dif = p.getnum() - n + 1 l1.append(dif) p = p.getnext() length = len(l1) for i in range(length): l2.append(l1.pop()) # append方法需要引數 return l2 mylist = eval(input()) print(nor(mylist))
備註
關鍵是搜尋的時候討論好各種情況