1. 程式人生 > 實用技巧 >最近的請求次數

最近的請求次數

題目內容

計算每個事件發生之時,往前算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))  

備註

關鍵是搜尋的時候討論好各種情況