ARTS 第 30 周

每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章


Contents


Algorithm

38. Count and say

题目:38. Count and say

难度:Easy

题意:

The count-and-say sequence is the sequence of integers with the first five terms as following:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 is read off as "one 1" or 11. 11 is read off as "two 1s" or 21. 21 is read off as "one 2, then one 1" or 1211.

Given an integer n where 1 ≤ n ≤ 30, generate the n th term of the count-and-say sequence.

Note: Each term of the sequence of integers will be represented as a string.

示例 1:

Input: 1
Output: "1"

示例 2:

Input: 4
Output: "1211"

解法:

本题乍一看比较难以理解,但是仔细一想其实并不难,就是对于前一个数,找出相同元素的个数,把个数和这个元素存储到新的字符串中去。

代码:

class Solution:
    def countAndSay(self, n: int) -> str:
        seq = "1"
        for i in range(n-1):
            seq = self.getNext(seq)
        return seq

    def getNext(self, seq):
        i, next_seq = 0, ""
        while i < len(seq):
            count = 1
            while i < len(seq) - 1 and seq[i] == seq[i+1]:
                count += 1
                i += 1
            next_seq += str(count) + seq[i]
            i += 1
        return next_seq

Review

The World In 50 Years

本周阅读了 QUARTZ 上的一篇文章 The World In 50 Years,QUARTZ 请了 50 位不同领域的学者就未来五十年做了预测,问题涉及到技术、经济、政治、人类生活中的生存、交流、娱乐、衣食住行等方方面面。

但实际上,这种预测的具体内容就当吃瓜看看就好,每个人对技术和未来的理解都不同,重要的是这些不同领域的学者智库站在不同角度观察世界的方式,这才是最能启迪人思想的地方。


Tips

正则表达式测试工具

开源中国正则表达式测试工具


Share

Show-me-the-code-0001 思路以及代码

正如 Linux 之父 Linus 所言:

Talk is cheap. Show me the code.

代码才是最能反映一个编程人员水平的方式,于是有了这个 Github 上的一个开源项目:Show-me-the-code:Python 练习册,每天一个小程序。于是我尝试做了两道题,觉得比较有趣,记录下来。

Show-me-the-code-0001

第 0001 题: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?

思路: 因为激活码要保证不能重复,所以使用集合这一数据结构来装所有的激活码。
首先生成一个 keys 的集合,生成一个大写字母和 0-9 的数字组成的 source 库,这是个列表。
使用 while 循环来生成激活码,从生成的 source 列表中使用 random.choice() 函数随机选择 length 个字符加到一起作为一个激活码。
将这个激活码加入到 keys 中去,这里 add() 函数会自动判断生成的激活码在不在 keys 中,如果不在,集合长度加一,否则集合长度不会增加。
继续循环直到集合长度等于初始设定的 number 数。

Code:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''  
@Author: AlainOUYANG  
@Date: 2019-10-21 17:06:02  
@LastEditors: AlainOUYANG  
@LastEditTime: 2019-10-21 17:47:19  
@Description: Show-me-the-code 0001  
'''

import random
import string


def gen_activation_key(length, number):
    '''  
    @description: generate activation key  
    @length {int}  
    @number {int}  
    @return: set  
    '''
    keys = set()
    source = list(string.ascii_uppercase + string.digits)

    while len(keys) < number:
        key = ''
        for i in range(length):
            key += random.choice(source)
        keys.add(key)
    return keys

if __name__ == "__main__":
    length = int(input("Please set the length of keys: "))
    number = int(input("Please set the number of keys: "))
    keys = gen_activation_key(length, number)
    print("Here are the keys generated (total: {0}):".format(len(keys)))

    for each_key in keys:
        print(each_key + ' length: {0}'.format(len(each_key)))