写点什么

ARTS-week5

用户头像
王钰淇
关注
发布于: 2020 年 07 月 02 日
ARTS-week5

Algorithm

  • 题目:209. 长度最小的子数组

  • 描述:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。

  • 示例:

  • 题解:

class Solution {public:    int minSubArrayLen(int s, vector<int>& nums) {        int nBegin = 0;        int nCurSum = 0;        int nMinLength = nums.size() + 1;        for(int i = 0; i < nums.size(); i++)        {            nCurSum += nums[i];            while(nCurSum >= s)            {                if (i - nBegin + 1 < nMinLength)                    nMinLength = i - nBegin + 1;                nCurSum -= nums[nBegin];                nBegin++;            }        }        if (nMinLength > nums.size())            return 0;        return nMinLength;    }};
复制代码



Review

文章:How the Facebook Ad Boycott Will End

链接:https://onezero.medium.com/facebooks-ad-war-heats-up-fe60d886cb60

内容介绍:文章讲述最近比较火的事件,民权组织呼吁企业暂停在 Facebook 和 Instagram 上的广告,已经演变成社交媒体公司的合法危机,组织者希望向 Facebook 施加压力,使其更积极地监控,审核仇恨言论和其他错误信息。广告抵制是一种改革社交媒体的机制,如果目标是刺激他们的政策不断变化,而不是彻底改革其基本结构,那么,抵制社交媒体平台可以奏效。


Tips

  • 标题:代码重构原则

  • 内容:

一、源文件

  • 函数行数尽量不要超过 50 行,超过 50 行的目前阶段并非严格禁止,但需要说明理由

  • 源文件长度尽量不要超过 500 行, 不同子功能、子模块的代码不要放在一个源文件中;理论上源文件分的越细越好。保证同一源文件中的代码“强内聚”。

  • 无特殊情况,不允许使用全局变量,一律局部静态化,对外封装访问接口,对有并发可能的业务, 均需在访问接口中作并发控制。

  • 函数拆分封装基本原则:明显的重复代码一律封装函数;何时该拆分较长函数、封装新函数?只要能提高代码的可读性、可复用性就该拆分:哪怕只有一行。

二、头文件

  • 头文件包含其他头文件的原则: 仅包含且必须包含那些头文件中所出现的类型需要的头文件(如,头文件 A 中出现的类型定义在头文件 B 中,则头文件 A 必须包含头文件 B,除此以外的其他头文件不允许包含)。头文件应该包含哪些头文件应该仅决定于它自己,而不是那些包含此头文件的源文件(如,将源文件编译时需要用到的头文件 B,这时源文件已经包含头文件 A 了,索性将头文件 B 包含在此头文件 A 中,这是错误的做法)。

  • 头文件划分原则:类型定义、宏定义应与函数声明相分离,分别位于不同的头文件中。内部函数声明头文件与外部函数声明头文件相分离,内部类型定义头文件,与外部类型定义头文件相分离。需要特别注意的是,外部函数声明头文件与外部宏、结构定义头文件一定要独立出来,这样可以保证外部调用者引用的头文件肯定是“最简化的”,不会包含外部调用者不需要的内部函数声明或者接口定义。

  • 头文件的语义层次化原则:头文件需要有语义层次,不同语义层次的类型定义不要放在一个头文件中,不同层次的函数声明不要放在一个头文件中。

  • 仅在一个源文件中用到的类型和宏定义,就放在此源文件中定义,不要放入任何头文件中。

  • 头文件的语义相关性原则:同一头文件中出现的类型定义、函数声明应该是语义相关的、有内部逻辑关系的,避免将风马牛不相及的定义和声明放在一个头文件中。

  • 对开放给其他模块使用的外部头文件尤其要注意其所包含的头文件的合理性,如包含太多不必要的其他头文件,将影响所有引用此头文件的模块,因此影响更严重。

三、代码复用

  • 库。 现成的通用数据结构及基于其上的通用算法、标准函数库、通用模板库 均可直接拿来使用,如 C++的 STL、BOOST 库。业务程序员应该集中精力于上层业务模型构建,而不是数据存储、数据访问这些“做轮子”的重复性的、机械的、还很容易出错的基础劳作。C 语言这方面的标准库非常欠缺,但非标准库并不缺少,这些库多半是由少数高级程序员开发,且在实践中久经考验,安全性、性能、可靠性方面可以说远超过大部分水平一般的代码,比如原来的 TMS 框架中就有相当多的基础库,ROS 中也有一些。能用的就要直接使用。库复用的难度在于必须按照库规定的使用方式来正确使用,越是复杂的库使用方式与注意事项也就越复杂。

  • 完全一样的代码, 直接封装函数予以复用,这是最简单的情况,没有任何难度,必须做到。

  • 基本上完全一样的代码,只是其中用到的变量不一样,封装成函数,将不一样的变量作为函数的参数传入。

  • 大部分一样的代码,只有其中少数几行代码不一样,封装一样的部分。(1)将不一样的部分封装成接口类型一致的函数,将函数作为函数指针参数传入可复用的函数,一般可以封装成一种接口的代码,我们称作可复用的是一种“代码结构”。(2) 如果不一样的地方差异比较大,无法封装成接口一致的函数,就需要考虑“要复用的东西倒底是什么”,也许你需要复用的不是“代码结构”,而是其他的东西,比如某种获取操作数据的方式。

  • 代码模式类似的代码,抽象出相同的“模式”,对模式进行编码,将代码的抽象层次升级。

  • 设计复用。 这是最高层次的复用,有现成的可行的优秀的解决方案,就采用之。 如面向对象领域已经蔚成风气的“设计模式”。设计模式即:在某种上下文环境适于采用的设计方案,用专用术语予以表达,减低沟通成本,形成一族“设计语汇”。


Share

  • 文章:使用简单的逻辑方法进行独立思考

  • 链接:https://coolshell.cn/articles/20533.html

  • 感受:耗子叔的一篇旧文,记录一篇他自己的思维方式,五步思考的方式:

  • 第一步:信息数据可考证

  • 第二步:处理集合和其包含关系

  • 第三步:处理逻辑因果关系

  • 第四步:找到靠谱的基准线

  • 第五步:更为深入和高维的思考


用户头像

王钰淇

关注

少花时间在说服别人的事上 2018.03.04 加入

跋涉中的C++程序员

评论

发布
暂无评论
ARTS-week5