CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。
CheckiO 官网:https://checkio.org/
我的 CheckiO 主页:https://py.checkio.org/user/TRHX/
CheckiO 题解系列专栏:https://itrhx.blog.csdn.net/category_9536424.html
CheckiO 所有题解源代码:https://github.com/TRHX/Python-CheckiO-Exercise
题目描述
【Create Intervals】:给定一个由整数组成的字典,找到连续的一串数字,将这串连续的数字的第一个数和最后一个数组成一个元组,最后返回多个元组组成的列表。
【链接】:https://py.checkio.org/mission/create-intervals/
【输入】:字典
【输出】:两个整数组成的元组列表
【范例】:
create_intervals({1, 2, 3, 4, 5, 7, 8, 12}) == [(1, 5), (7, 8), (12, 12)]
create_intervals({1, 2, 3, 6, 7, 8, 4, 5}) == [(1, 8)]
解题思路
定义两个列表,start
列表用于储存元组的第一个数字,end
列表用于储存元组的第二个数字;
对于 start
列表:循环访问 data
字典,遍历所有数字,将数字减一,如果没有在原字典中,则表示这个数字是一个元组开头的数字;
对于 end
列表:循环访问 data
字典,遍历所有数字,将数字加一,如果没有在原字典中,则表示这个数字是一个元组结束的数字;
最后使用 zip
方法将两个列表中对应的元素打包成一个个元组,然后返回由这些元组组成的列表即可。
代码实现
def create_intervals(data):start, end = [], []for i in data:if i-1 not in data:start.append(i)if i+1 not in data: end.append(i)return list(zip(sorted(start), sorted(end)))if __name__ == '__main__':#These "asserts" using only for self-checking and not necessary for auto-testingassert create_intervals({1, 2, 3, 4, 5, 7, 8, 12}) == [(1, 5), (7, 8), (12, 12)], "First"assert create_intervals({1, 2, 3, 6, 7, 8, 4, 5}) == [(1, 8)], "Second"print('Almost done! The only thing left to do is to Check it!')
大神解答
大神解答 NO.1
def create_intervals(data):left = [x for x in data if x - 1 not in data]right = [x for x in data if x + 1 not in data]return list(zip(sorted(left), sorted(right)))
大神解答 NO.2
def create_intervals(data):plus_one, minus_one = [], []for d in sorted(data):if d - 1 not in data:minus_one.append(d)if d + 1 not in data:plus_one.append(d)return list(zip(minus_one, plus_one))
大神解答 NO.3
def create_intervals(data):return list(zip(sorted(x for x in data if x-1 not in data),sorted(x for x in data if x+1 not in data)))