算法练习 Leetcode 力扣 238. Product of Array Except Self解法

解法1, 用一个list记录从左边开始除了自己的乘积,然后另一个list记录右边开始除了自己的乘积,然后把这辆list对应项乘起来就行。实际实现的时候右边的list可以用一个数代替节省一点空间

例子 1,没有0的情况

例子 2,有0的情况

思路其实和盛水题目有点像

时间 O(N),空间 O(N)

Python代码

class Solution:
    # @param {integer[]} nums
    # @return {integer[]}
    def productExceptSelf(self, nums):
        l = len(nums)
        ret = [1] * l
        for i in range(1, l):
            ret[i] = ret[i-1] * nums[i-1]
        right = 1
        for i in range(l-2, -1, -1):
            right *= nums[i+1]
            ret[i] *= right
        return ret
            

解法2,根据0的情况分类。

如果没0,全部乘起来,然后再扫一遍,除以自己。
有一个0,把非0的乘起来,除了0的位置,其他全是0, 0的位置为其他非0的乘积。
有2个及以上的0,全部都是0

例子

时间 O(N),空间 O(N)

Python

class Solution(object):
    def productExceptSelf(self, nums): 
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        product = None
        zero_index = None
        zero_counts = 0
        for i in xrange(len(nums)):
            if product is None:
                product = nums[i]
                continue
            
            if nums[i] != 0:
                product *= nums[i]
            else:
                zero_counts += 1
                zero_index = i
            
            if zero_counts == 2:
                break
        
        if product is None:
            return product
        
        if zero_counts == 0:
            products = [product / x for x in nums]
        elif zero_counts == 1:
            products = [0] * len(nums)
            products[zero_index] = product
        else:
            products = [0] * len(nums)
        return products

做这题想到这俩解法相隔竟已5年。

启动特斯拉 Model 3 的行车记录仪功能 | Enabling Tesla Model 3’s Dash Cam

Model 3自带了行车记录仪功能,但是很多车主不知道,这并不是自动就能用的。最近出了一次事故,如果当时有视频记录就好了。所幸最后保险赔偿并没太多麻烦纠纷。于是最近决定把这功能弄好。

其实也很简单,找一U盘,格式化成FAT32格式(MS-DOS),然后建一个新的文件夹,起名叫TeslaCam,注意用的是Camel case,T和C大写。然后把这U盘插入到手套箱里的USB接口里就行。插入后会看到屏幕上右上角出现一个照相机的图标并有一个小红点,说明开始录像了。

网上说因为行车记录一直写入删除,很伤U盘,这样U盘很快会坏掉。可以买high endurance的micro SD卡加一个USB adapter代替。这样会耐用很多。

查询I-94状态 | Check I-94 status

I-94是美国的入境记录。可以在DHS (Department of Homeland Security)提供的网站查询状态。

如果入境用的是Advance Parole (AP),Class of Admission就是DA。在填写I-131申请或更新AP/Combo card的时候会要用到这个信息。以04/24/19版本的I-131为例子,Part 1. 6需要填写DA,如果最后一次入境美国是用AP

用Python合并奇偶页面的pdf文件 | merge odd and even pages pdf files using Python

最近入手了一打印机+扫描仪器,能双面打印确不能双面扫描。如果是两面打印的文档就只能分单双页面扫描。扫描完了需要合并。这个需要特殊的软件。网上找不到信得过的,干脆google一下用python自己写一个小工具来做这事。参考了这篇文章,改写后代码如下:

import itertools as itt
import sys

import PyPDF2 as PDF

import argparse


def main():

    parser = argparse.ArgumentParser(description='merge odd and even number pdf')
    parser.add_argument('--odd', '-o', dest='odd', required=True, type=str)
    parser.add_argument('--even', '-e', dest='even', required=True, type=str)
    parser.add_argument('--output', dest='output', required=True)
    parser.add_argument('--even-reversed', '-er', dest='even_reversed', type=bool, default=False)
    args = parser.parse_args()
    
    pdf_out = PDF.PdfFileWriter()

    with open(args.odd, 'rb') as f_odd:
        with open(args.even, 'rb')  as f_even:
            pdf_odd = PDF.PdfFileReader(f_odd)
            pdf_even = PDF.PdfFileReader(f_even)

            for p in itt.chain.from_iterable(
                itt.zip_longest(
                    pdf_odd.pages,
                    reversed(pdf_even.pages) if args.even_reversed else pdf_even.pages,
                )
            ):
                if p:
                    pdf_out.addPage(p)

            with open(args.output, 'wb') as f_out:
                pdf_out.write(f_out)

    return 0


if __name__ == "__main__":
    sys.exit(main())

需要安装PyPDF2这个package来处理pdf:

pip install PyPDF2