查看: 1525| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Python/Perl] Python刷题Tricks和Tips - 巧用range来解题

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
我前几个月开始使用python来刷题, 然后收集了一些比较有用的tricks. 这篇文章主要是谈论range的用法。
会谈到的点:
1. Intro: 大概介绍range
2. Tips: range可以用于执行n次的东西
3. Tips: range可以搭配zip一起用, 可以用到index
4. Tips: 两种方式可以用range来从后面开始iterate list

1. Intro:
range(
  start_index, # inclusive, 这个会被包括在range里面
  end_index, # exclusive, 这个不会被包括在range里面
  stepsize, # 每次increment/decrement的量
)

example:
range(5) 是等于 [0, 1, 2, 3, 4]
range(1, 5) 是等于 [1, 2, 3, 4]
range(1, 10,2) 是等于 [1, 3, 5, 7, 9]

2. range可以用于需要执行n次的东西


用法:
range这个用法只会被执行n次, 可以在一些场合里面很有作用, 比如说BFS
for _ in range(n):
## …

example:
BFS example:
这个是 Binary Tree Level Traversal 的答案

    def levelOrder(self, root):
        res = []
        queue = []
        queue.append(root)

        while len(queue):
            cur_len = len(queue)
            cur_level = []
            # 这里使用range 可以确保我们当前只在往cur_level加入现在这一层的node
            for _ in range(cur_len):
                cur_node = queue.pop(0)
                cur_level.append(cur_node.val)
                if cur_node.left:
                    queue.append(cur_node.left)
                if cur_node.right:
                    queue.append(cur_node.right)
            res.append(cur_level)
        return res

3. 巧用zip让我们可以同时拿到index和value, 在有些问题里面会很便利

用法:
for index, num in zip(range(len(nums)), nums):
## …

example:
Two sum example:

  1.     def twoSum(self, nums, target):
  2.         hashtable = {}
  3.         # 这里使用zip, 我们可以省略 num = nums[i] 那一步
  4.         # 这样可以让code看起来更干净一些
  5.         for i, num in zip(range(len(nums)), nums):
  6.           new_t = target - num
  7.           if new_t in hashtable:
  8.             return [hashtable[new_t], i]
  9.           else:
  10.             hashtable[num] = i
复制代码


4. 如何reverse iteration

用法:
这个适用于需要从list后面开始iterate的题目

for i in range(n)[::-1]:
## …
for i in range(n-1, -1, -1):
## …




最后 求一下大米 🙏。 没有大米的我 很多东西都看不到。 希望大家好好支持啦, 如果有需要 我会继续发类似的帖子


补充内容 (2019-8-12 17:43):
补充一下, 感谢@b00901192 的建议, 我们也可以用for i, num in enumerate(nums), 这样比用zip更干净一些[/i]

评分

参与人数 4大米 +47 收起 理由
百米飞人张宝华 + 2 很有用的信息!
lokomotiv + 2 给你点个赞!
admin + 40
鲁雪松 + 3 给你点个赞!

查看全部评分


上一篇:刷題「嚴格打卡」 有興趣可以一起
下一篇:Leetcode刷题700+后的困惑与迷茫
推荐
b00901192 2019-8-12 07:26:54 | 只看该作者
全局:
3. We can use `enumerate`. For example,
  1. for i, num in enumerate(nums):    print(num, i)
复制代码



回复

使用道具 举报

推荐
instant_dev 2019-8-13 00:41:21 | 只看该作者
全局:
python的常用写法可以参考这篇文章
回复

使用道具 举报

🔗
admin 2019-8-13 00:25:17 | 只看该作者
全局:
提示大家:

如果你的代码里还有  [i ](去掉多余空格) 容易出问题。

如何解决?
发帖框里有 "<>",这个是代码block,可以选择语言,可以完美避免 代码跟html/discuz code混乱的问题,而且UI更美观。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表