Dec 16, 2019 ~ Dec 22, 2019

Algorithm

Problem 53 Maximum Subarray 最大子数组 题目链接

题目描述:给定一个数组,在所有连续的子数组中,求得其中的最大值,举例如下:

数组:[-2,1,-3,4,-1,2,1,-5,4]

返回结果:6, 子数组 [4, -1, 2, 1] 的和最大

思路:该题目有多种可以解决思路。比如分治法,动态规划,贪心法。本次为了方便理解,采用贪心法。贪心法的贪心策略是在某个位置的一个数与其下一个数的和 和 下一个数 中,选择更大的,即 currsum = max(currsum+nums[i], nums[i]) 。若想求得数组中的最大子数组,只需要把每个位置的最大和进行比较,便可以得到最大子数组和,即 maxsum = max(maxsum, currsum)

通过的代码如下

class Solution:
def maxSubArray(self, nums: List[int]) -> int:
maxsum = currsum = nums[0]
for i in range(1, len(nums)):
currsum = max(currsum+nums[i], nums[i])
maxsum = max(maxsum, currsum)
return maxsum

Review

本周继续 Review 每个程序员需要知道的97件事(英文名:97 Things Every Programmer Should Know)。原文链接。下面是本周的5个小内容:

  • 重构之前(Before You Refactor) 原文链接

    重构的最佳方法是查看现有代码,从编写针对现有代码的测试开始,这样有助于了解到现有代码的优点和缺点。从而继承优点,避开缺点。重构代码要避免重写所有代码,要尽可能地复用已经有的代码,因为他们已经通过了测试,可以对已有代码进行增量修改。如果必须要编写新代码,那么要保证新代码必须能通过之前的测试。此外,不应该因个人喜好而去重构某些代码。
  • 当心共享(Beware the Share) 原文链接

    虽然某些地方需要的代码功能很接近,但是因为上下文,以及具体的需求,业务过程不同。贸然的重用代码可能会带来某些难以解决的问题。所以,当重用代码时尽量考虑下具体环境,一旦重用不当,带来的不是便捷性,而是增加了隐患。
  • 童子军规则(The Boy Scout Rule) 原文链接

    童子军有这样一条规则:“离开营地时要比发现它时干净”。同样地,我们在代码中发现一个不太好的地方后,尽可能帮忙改正。不一定要是重要的问题或者bug之类,一些小的问题也同样值得改进,比如 重新命名下函数中的变量名,将一个长函数拆分为两个或多个函数等等,这样都可以帮助整个项目向好的方向发展。
  • 在指责其他之前先检查自己的代码(Check Your Code First before Looking to Blame Others) 原文链接

    我们经常遇到这样情况,“为什么我的代码在我本地就跑得好好地,在别的电脑上就不能运行or错误运行,这一定是环境配置不正确,或者编译器/解释器/框架版本的原因,或者干脆是多运行几次,也许有一次能正常运行”。在遇到这些情况时,我们应该首先去检查自己的代码是否存在问题,而不是去抱怨/指责环境,其他客观问题。事实上,大部分这种情况出现根源还是在代码本身
  • 谨慎选择工具(Choose Your Tools with Care) 原文链接

    现如今,Web 上许多可用的工具用来帮助你构建某些功能、模块。但是,不同工具可以利用了不同的依赖(比如:基础结构,控制模型,数据模型,通信协议),而在这些内容可能存在某些冲突。不同的工具具有不同的生命周期,一些生命周期长的工具,通常也比较复杂,你需要事先进行配置。此外,如果你选择自由软件,可能你的产品会受到其约束(例如GPL协议),如果你选择商业软件,可能你会发现开销很大。因此,选择工具时需要谨慎,尽可能少的,选择有用的工具。

Tips

Python中检查字符串中是否由某些字符组成的函数有很多,下面是一些详细的解释:

str.islower()、str.isupper()、str.istitle():这三个方法很类似,其结果为 True 的有两个条件,其一字符串中至少有一个字符是可以有大小写的,这个条件三个方法是相同的。不同的是第二个条件,

  • str.islower():指的是所有这些可以有大小写的字符均为小写
  • str.isupper():指的是所有这些可以有大小写的字符均为大写
  • str.istitle():指的是字符串中的所有单词都是标题化的(即首字符有大小写字符的大写字符,其余字符中有大小写字符的均为小写字符)。

    具体举例如下:
print('123')
print('123.islower() is ' + str('123'.islower())) # False
print('123.isupper() is ' + str('123'.isupper())) # False
print('123.istitle() is ' + str('123'.istitle())) # False print('1q@#')
print('1q@#.islower() is ' + str('1q@#'.islower())) # True
print('1q@#.isupper() is ' + str('1q@#'.isupper())) # False
print('1q@#.istitle() is ' + str('1q@#'.istitle())) # False print('QAQ')
print('QAQ.islower() is ' + str('QAQ'.islower())) # False
print('QAQ.isupper() is ' + str('QAQ'.isupper())) # True
print('QAQ.istitle() is ' + str('QAQ'.istitle())) # False print('Qaq')
print('Qaq.islower() is ' + str('Qaq'.islower())) # False
print('Qaq.isupper() is ' + str('Qaq'.isupper())) # False
print('Qaq.istitle() is ' + str('Qaq'.istitle())) # True print('Q123-q.istitle() is ' + str('Q123-q'.istitle())) # False
print('Q123-Q.istitle() is ' + str('Q123-Q'.istitle())) # True

str.isspace(),str.isalpha(),str.isalnum():这三个方法很接近,其含义分别为:

  • str.isspace():表示字符串中至少有一个字符,且所有字符均在此字符集合中 { ' ', '\t', '\n', '\v', '\f', '\r' },则结果为 True
  • str.isalpha():表示字符串中至少有一个字符,且所有字符均字母字符,则结果为 True
  • str.isalnum():表示字符串中至少有一个字符,且所有字符均字母或数字字符,则结果为 True。

    举例如下:
print("'qwe asd'.isspace() is " + str('qwe asd'.isspace()))         # False
print("''.isspace() is " + str(''.isspace())) # False
print("' \t\n\v\f\r'.isspace() is " + str(' \t\n\v\f\r'.isspace())) # True print("''.isalpha() is " + str(''.isalpha())) # False
print("'qwe'.isalpha() is " + str('qwe'.isalpha())) # True
print("'123qwe'.isalpha() is " + str('123qwe'.isalpha())) # False print("''.isalnum() is " + str(''.isalnum())) # False
print("'qwe'.isalnum() is " + str('qwe'.isalnum())) # True
print("'123qwe'.isalnum() is " + str('123qwe'.isalnum())) # True

最后,还剩下三个类似于上面六个的函数,分别为str.isdecimal()、str.isdigit()、str.isnumeric()。它们之间的区别我现在还没有太清楚,等我清楚后再记录下来。更新:它们三者之间的区别我将其记录在了下一周的ARTS中,文章链接如下:ARTS Week 9

Sharing

在 Review 部分中,提到谨慎选择工具,我觉得很不错。很多人喜欢用现有的库来完成某一任务,如果你的软件仅仅是像学生时代交作业时检查通过后便不再维护,那么用这些库来完成任务是可以的。但是,如果你的软件需要长时间维护,那么用现有的库则需要谨慎。具体优缺点见 Review 部分。

ARTS Week 8的更多相关文章

  1. KDE声音服务器 arts

    KDE声音服务器 arts arts介绍arts是KDE的核心声音系统,支持多音频流.全双工.网络声音请求.ALSA与OSS驱动后端.JACK声音服务器后端等扩展,它既是声音服务器,也 提供一套音频软 ...

  2. 【ARTS】01_21_左耳听风-201900401~201900407

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  3. 【ARTS】01_20_左耳听风-20190325~20190331

    zz## ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 ...

  4. 【ARTS】01_19_左耳听风-20190318~20190324

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  5. 【ARTS】01_18_左耳听风-20190311~20190317

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  6. 【ARTS】01_17_左耳听风-20190304~20190310

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  7. 【ARTS】01_16_左耳听风-20190225~20190303

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  8. 【ARTS】01_15_左耳听风-20190218~20190224

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  9. 【ARTS】01_14_左耳听风-20190211~20190217

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  10. 【ARTS】01_13_左耳听风-20190204~20190210

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

随机推荐

  1. 变量内容的删除、取代与替换(optional)

    这部分内容非常繁琐且不易记忆且枯燥,用到来查询即可. 1.变量内容的删除 这一部分比较细枝末节,就不再一一手打了,贴范例图片 #:符合取代文字的最短的一个 ##:符合取代文字的最长的一个 2.变量内容 ...

  2. 【原创】快速失败机制&失败安全机制

    这是why技术的第29篇原创文章 之前在写<这道Java基础题真的有坑!我求求你,认真思考后再回答.>这篇文章时,我在8.1小节提到了快速失败和失败安全机制. 但是我发现当我搜索" ...

  3. Spring Cloud(二):Web服务客户端之Ribbon

    上文介绍了服务如何通过Eureka实现注册,以及如何从Eureka获取已经注册的服务列表.那么拿到注册服务列表后, 如何进行服务调用?一个简单的实现是可以从被调用服务的实例列表中选择一个服务实例,通过 ...

  4. ORM基础1

    1.增删改查 .models.类.object.all() 获取所有对象->select * from 表 2.models.类.object.get(id=1) 获取id为1的对象->s ...

  5. 【红外DDE算法】聊聊红外图像增强算法的历史进程(第一回)

    宽动态红外图像增强算法综述回顾过去带你回顾宽动态红外图像增强算法的历史进程,历来学者的一步步革命(新的算法框架提出),一步步改革(改进优化),从简单粗暴到细致全面.正所谓是:改革没有完成时,只有进行时 ...

  6. 编译游戏库allegro

    一个allegro依赖了大概十个库,还得自己一个个的去编译,然后复制粘贴 主要从两个网页学到的 第一个网页里有绝大多数的依赖库的编译方法 http://wiki.allegro.cc/index.ph ...

  7. Jmeter之BeanShell断言使用

    1.Bean Shell常用内置变量 JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:用来记录日志文件,写入到j ...

  8. lua 中 . 和 : 的区别

    lua 中 . 和 : 的区别 首先在lua中使用":"定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针:而&qu ...

  9. k8s概述

    k8s概述 概述 Kubernetes 使你在数以千计的电脑节点上运行软件时就像所有这些节点是单个大节点一样.它将底层基础设施抽象,这样做同时简化了应用的开发.部署, 以及对开发和运维团队的管理. K ...

  10. Java 构造方法总结

    Java 构造方法总结 ①方法名和 类名相同 ②在方法名的前面没有返回值类型的声明 ③在方法中不能使用return语句返回一个值 ④在创建对象时,要调用new,如:book b1=new book() ...