1. 我的日程安排算法实现
问题描述:实现存储日程事件的 MyCalendar类。如果没有重复或者交叉事件,则添加该事件到MyCalendar类实例中。
你的类拥有book(int start, int end)方法. 形式上, 间隔范围为[start, end) 。
重复或者交叉事件为start、end在某个间隔中间,注意:start、end可以等于间隔的后端值。
添加成功,book方法返回true,否则为false。
例子1:
MyCalendar();
MyCalendar.book(10, 20); // returns true
MyCalendar.book(15, 25); // returns false
MyCalendar.book(20, 30); // returns true
解释:
中间的book方法参数前端值为15,在(10, 20)之间,所以不能添加到实例中,返回false。
实现代码:
class MyCalendar:
def __init__(self):
self.position = []
def book(self, start, end):
"""
:type start: int
:type end: int
:rtype: bool
"""
if len(self.position) == 0:
self.position.append((start, end))
return True
for i in range(0, len(self.position)):
key = self.position[i][0]
value = self.position[i][1]
if start in range(key, value) or end in range(key + 1, value):
return False
elif start < key < end:
return False
for i in range(0, len(self.position)):
if start < self.position[i][0]:
self.position.append(self.position[len(self.position) - 1])
for j in range(len(self.position) - 2, i, -1):
self.position[j] = self.position[j - 1]
self.position[i] = (start, end)
return True
self.position.append((start, end))
return True
# Your MyCalendar object will be instantiated and called as such:
# obj = MyCalendar()
# param_1 = obj.book(start,end)
if __name__ == '__main__':
obj = MyCalendar()
param_1 = obj.book(47, 50)
param_2 = obj.book(33, 41)
param_3 = obj.book(39, 45)
param_4 = obj.book(33, 42)
param_5 = obj.book(25, 32)
param_6 = obj.book(26, 35)
param_7 = obj.book(19, 25)
param_8 = obj.book(3, 8)
param_9 = obj.book(8, 13)
param_10 = obj.book(18, 27)
print(param_1)
print(param_2)
print(param_3)
print(param_4)
print(param_5)
print(param_6)
print(param_7)
print(param_8)
print(param_9)
print(param_10)
# ["MyCalendar", "book", "book", "book", "book", "book", "book", "book", "book", "book", "book"]
# [[], [47, 50], [33, 41], [39, 45], [33, 42], [25, 32], [26, 35], [19, 25], [3, 8], [8, 13], [18, 27]]
缺点:超出时间限制
改进:
class MyCalendar:
def __init__(self):
self.calendar = []
def book(self, start, end):
"""
:type start: int
:type end: int
:rtype: bool
"""
for s, e in self.calendar:
if start < e and end > s:
return False
self.calendar.append((start, end))
return True
# Your MyCalendar object will be instantiated and called as such:
# obj = MyCalendar()
# param_1 = obj.book(start,end)
if __name__ == '__main__':
obj = MyCalendar()
param_1 = obj.book(47, 50)
param_2 = obj.book(33, 41)
param_3 = obj.book(39, 45)
param_4 = obj.book(33, 42)
param_5 = obj.book(25, 32)
param_6 = obj.book(26, 35)
param_7 = obj.book(19, 25)
param_8 = obj.book(3, 8)
param_9 = obj.book(8, 13)
param_10 = obj.book(18, 27)
print(param_1)
print(param_2)
print(param_3)
print(param_4)
print(param_5)
print(param_6)
print(param_7)
print(param_8)
print(param_9)
print(param_10)
# ["MyCalendar", "book", "book", "book", "book", "book", "book", "book", "book", "book", "book"]
# [[], [47, 50], [33, 41], [39, 45], [33, 42], [25, 32], [26, 35], [19, 25], [3, 8], [8, 13], [18, 27]]
第一个代码实现插入间隔时,还要移动插入点后面的间隔,所以时间花费大。本代码直接插入。
代码中的数据结构为元组列表。()表示元组、[]表示列表,即列表中的元素为一个一个的元组。元组存储间隔。
2. 判断一个字符串是不是回文
public boolean palindrome(String x) {
for (int i = 0; i < x.length() / 2; i++) {
if (x.charAt(i) != x.charAt(x.length() - 1 - i)) {
return false;
}
}
return true;
}
3. 求某个数的阶乘
public long func(int x) {
long output = 0;
if (x <= 1) {
output = 1;
} else
output = x * func(x - 1);
return output;
}