这可能是一个非常广泛的问题。我想创建一种表示字符串的方法,该方法支持 O(1) 追加、O(1) 向左追加和 O(1) 比较,同时保持 O(N) 切片和 O(1) 索引。我的想法是,我将 unicode 字符存储为其 unicode 编号,并使用数学运算从两端添加和删除字符。我将其命名为“NumString”:
class Numstring:
def __init__(self, init_str=""):
self.num = 0
self.length = 0
for char in init_str:
self.append(char)
def toString(self, curr=None):
if curr is None:
curr = self.num
retlst = []
while curr:
char = chr(curr % 10000)
retlst.append(char)
curr = curr // 10000
return "".join(retlst)
def appendleft(self, char):
assert len(char) == 1
self.num *= 10000
self.num += ord(char)
self.length += 1
def append(self, char):
self.num += ord(char)*(10000**self.length)
self.length += 1
def pop(self):
# self.num = self.num % (10000**self.length-1)
self.num = self.num % 10000**(self.length-1)
self.length -= 1
def popleft(self):
self.num = self.num // 10000
self.length -= 1
def compare(self, numstring2):
return self.num == numstring2.num
def size(self):
return self.length
def get(self, start, end=None):
if start >= self.length:
raise IndexError("index out of bounds")
if end and end > self.length + 1:
raise IndexError("index out of bounds")
if end is not None:
if start == end:
return ""
curr = self.num
curr = curr // (10000 ** start)
curr = curr % 10000**(end)
return self.toString(curr)
else:
curr = self.num
curr = curr // (10000 ** start)
char = chr(curr % 10000)
return char
慕桂英546537
相关分类