ARTS 第三周 -0513

8 篇文章 0 订阅
  • Algorithm主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell
  • Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
  • Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
  • Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章

打卡地址

Algorithm 算法

实现strStr()

也就是java中的字符串的indexOf方法,一个字符串在另一个字符串中万全匹配,第一次出现的位置。
 

暴力破解法

    public static int strStr(String haystack, String needle) {
        if (needle == null || "".equals(needle)) {
            return 0;
        }
        if (haystack == null || "".equals(haystack) || needle.length() > haystack.length()
                || (needle.length() == haystack.length() && !needle.equals(haystack))) {
            return -1;
        }

        char[] haystackCharArray = haystack.toCharArray();
        char[] needleCharArray = needle.toCharArray();

        for (int i = 0; i <= haystackCharArray.length - needleCharArray.length; i++) {
            if (haystackCharArray[i] == needleCharArray[0]) {
                boolean flag = true;
                for (int j = 1; j < needleCharArray.length && flag; j++) {
                    if (haystackCharArray[i + j] != needleCharArray[j]) {
                        flag = false;
                    }
                }
                if (flag) {
                    return i;
                }
            }
        }
        return -1;
    }

 

首先想到的就是这种方式了
 

以下讲解和图片来自  https://www.cnblogs.com/en-heng/p/5091365.html

暴力匹配方法的思想非常朴素:

  1. 依次从主串的首字符开始,与模式串逐一进行匹配;
  2. 遇到失配时,则移到主串的第二个字符,将其与模式串首字符比较,逐一进行匹配;
  3. 重复上述步骤,直至能匹配上,或剩下主串的长度不足以进行匹配。

下图给出了暴力匹配的例子,主串T="ababcabcacbab",模式串P="abcac"

第一次匹配:

第二次匹配:

第三次匹配:

时间复杂度i在主串移动次数(外层的for循环)有n−p次,在失配时j移动次数最多有p−1次(最坏情况下);因此,复杂度为O(n∗p)。

 

我们仔细观察暴力匹配方法,发现:失配后下一次匹配,

  • 主串的起始位置 = 上一轮匹配的起始位置 + 1;
  • 模式串的起始位置 = 首字符P[0]

如此未能利用已经匹配上的字符的信息,造成了重复匹配

举个例子,比如:第一次匹配失败时,主串、模式串失配位置的字符分别为 a 与 c,下一次匹配时主串、模式串的起始位置分别为T[1]P[0];而在模式串中c之前是ab,未有重复字符结构,因此T[1]P[0]肯定不能匹配上,这样造成了重复匹配。直观上,下一次的匹配应从T[2]P[0]开始。

 

高端的KMP算法,需要学习。

KMP算法思想便是利用已经匹配上的字符信息,使得模式串的指针回退的字符位置能将主串与模式串已经匹配上的字符结构重新对齐

 

 

Review 回顾

capable:能干的,有才能的,有能力的

retrieves:检索,取回;挽回;找回

superficial :肤浅的;浅薄的

conquered :占领;攻克;征服;

fundamentals :基本原理;基础

in addition to:除了

 

The algorithm and data structures inflection point is a less superficial inflection point, but it is actually more important. Someone who has conquered this point will have mastered the programming language they’re working in, in addition to mastering the fundamentals of programming and having a depth of knowledge for solving complex coding challenges.

算法和数据结构的拐点不是那么浅薄粗略的拐点,实际上它很重要。很多攻克了这一点的人,除了掌握编程基础和具有解决复杂编码难题的知识以外,还征服了他们使用的编程语言。

 

征服算法和数据结构拐点的人可以:

  • Write sorting algorithms
  • Implement and reverse linked lists
  • Understand and write programs leveraging stacks, queues, and trees
  • Write computer programs using recursive or iterative solutions
  • 编写排序算法
  • 实现和反转 linked lists
  • 明白和编写利用 堆栈、队列、树的程序
  • 用递归和迭代解编写程序

 

 

 

Tip 知识点

来自耗子叔的 左耳听风19

很多时候,就是一味的学习一门技术,但是根本不了解一门技术的优势,它解决了什么问题,是否有发展前景,以至于为什么要学这门技术,是否要深入学习,成了疑问。

所以,我个人觉得一项有价值的技术,并不在于这项技术是否有技术含量,而是在于:

  • 能否低成本高效率地解决实际问题;
  • 是不是众多产品的基础技术; 
  • 是不是可以支持规模化的技术。

 

对于我们搞计算机软件的人来说,也可以找到相对应的技术点。比如:

  • 低成本高效率地解决实际问题的技术,一定是自动化的技术。 软件天生就是用来完成重复劳动的,天生就是用来做自动化的。而未来的AI和loT也是在拼命数字化和自动化还没有自动化的领域。
  • 基础技术总是枯燥和有价值的。数学、算法、网络、存储等基础技术吃得越透,就越容易服务上层的各种衍生技术或产品。
  • 支持规模化的技术也是很有价值的。在软件行业中,也就是PaaS的相关技术。

 

 

 

Share分享

最近再开发一个签到功能,所以在网上搜索,找到一个关于产品和需求的网站,里面的分析对于一个后台开发人员简直是打开了一个新世界,产品很多时候是要顺着人性、欲望、习惯来做的,做一个东西要让用户有使用的动力和欲望才能算是一个成功的功能。

 

人人都是产品经理

抓住用户的魔性功能:签到

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值