Tehtäväsi on toteuttaa luokka, joka pitää yllä listaa luvuista sekä tarjoaa metodin, joka kasvattaa tehokkaasti kaikkia listan lukuja halutun verran.
Toteuta tiedostoon changelist.py luokka ChangeList, jossa on seuraavat metodit:
append(number): lisää luku listan loppuunget(index): hae luku listaltachange_all(amount): kasvata kaikkia listan lukuja halutun verran
Metodissa change_all parametri amount ilmaisee, paljonko listan lukuja tulee kasvattaa. Parametri voi olla myös negatiivinen, jolloin lukuja vähennetään. Kaikkien metodien tulee toimia ajassa O(1).
class ChangeList:
def __init__(self):
# TODO
def append(self, number):
# TODO
def get(self, index):
# TODO
def change_all(self, amount):
# TODO
if __name__ == "__main__":
numbers = ChangeList()
numbers.append(1)
numbers.append(2)
numbers.append(3)
print(numbers.get(0)) # 1
print(numbers.get(1)) # 2
print(numbers.get(2)) # 3
numbers.change_all(2)
print(numbers.get(0)) # 3
print(numbers.get(1)) # 4
print(numbers.get(2)) # 5
numbers.append(8)
numbers.change_all(-1)
print(numbers.get(0)) # 2
print(numbers.get(1)) # 3
print(numbers.get(2)) # 4
print(numbers.get(3)) # 7
Tässä listalle lisätään ensin luvut 1, 2 ja 3, minkä jälkeen listan sisältö on [1,2,3]. Sitten listan kaikkiin lukuihin lisätään luku 2, minkä jälkeen listan sisältö on [3,4,5]. Lopuksi listalle lisätään luku 8 ja kaikkiin lukuihin lisätään luku -1, minkä jälkeen listan sisältö on [2,3,4,7].
Voit tutkia ratkaisusi tehokkuutta seuraavan testin avulla. Tässäkin tapauksessa koodin tulisi antaa vastaus välittömästi.
numbers = ChangeList()
total = 0
for i in range(10**5):
numbers.append(i + 1)
numbers.change_all(i % 11 - 5)
total += numbers.get(i // 2)
print(total) # 2500049970
