ARTS 第二周

Algorithm

LeetCode 23 合并K个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路:每次合并两个链表,直到最后只有一条列表。

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        int len = lists.length;
        if (len <= 0) return null;
        int num = len;
        while (num != 1) {
            int mid = num / 2;
            for (int i = 0; i < mid; i++) {
                if(lists[i] == null || lists[i+mid] == null) lists[i] = mergeTwoLists(lists[i], lists[i + mid]);
                else lists[i] = mergeTwoLists(lists[i], lists[i + mid]).next;
                
            }
            if ((num & 1) != 0) {
                lists[mid] = lists[num - 1];
                num = mid + 1;
            } else {
                num = mid;
            }
        }
        return lists[0];
    }
    private ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1 == null) return list2;
        if (list2 == null) return list1;
        ListNode a = list1;
        ListNode b = list2;
        ListNode c = null;
        ListNode head = new ListNode(0);
        ListNode pre = head;
        while (a != null && b != null) {
            c = new ListNode(0);
            pre.next = c;
            if (a.val > b.val) {
                c.val = b.val;
                b = b.next;
            } else {
                c.val = a.val;
                a = a.next;
            }
            pre = c;
            c = c.next;
        }
        if (a != null) {
            pre.next = a;
        }
        if (b != null) {
            pre.next = b;
        }
        return head;
    }
}

查了一下还有很多种做法, 原文地址

Review

这篇文章是皓哥在自己文章中贴的一个网址
下面是我从中得到的知识,不过我认为我还没有学到、做到,所以一定要努力。

一、辅助性的课程

多加练习,把编程当作你的第二天性。

二、关注细节

纠错是每个程序员遇到的第一个大难关,比如拼写错误等。你要在细节上付出你的注意力,知道如何去解决同样的错误。
学会Debug,debug可以让你快速找出错误,而且也能让你更清晰代码的流程。debug可以很快帮程序员提高。
遇到错误不要第一时间就去查资料,一定要有自己的思考。你可能会在这上面一些时间,但是这对你帮助很大。
你应该从你的每个错误中学习,不要仅仅是把它改正就好,而是要去弄清楚哪里出错。
编程是一件终身学习的知识,如果你想把一切事情都解决是不可能的。
经验丰富的软件工程师只是会寻找尚未解决的问题的解决方案。
学习怎么去学习比学习知识更重要。

三、The Inflection Point (2-4 weeks with the right mentality)

在这里插入图片描述
突破这个Inflection是一个非常困难的阶段,但也是最重要的。这个点就是:

当你脱离开文档或者教程,去解决没有人为你准备好东西的问题的时候。

这个时候你可能会感到非常的沮丧,可能是因为你的编码速度可能比一开始慢10倍甚至20倍。
你可能会怀疑自己不适合做一个程序员。这种怀疑感其实是非常常见的。
尽管你可能觉得学习和完成事情特别慢,但是实际上,你在学习更重要的东西。就是去解决问题的过程。

四、For the rest of your life, go outside your limits every single day

在你的余生中,每天都要超越自己的极限。
在现在的国内社会中,趋于安定,很多人想要的只是一份稳定的生活:父母为了照看照顾孩子、为了孩子的未来生活,只是甘心受于一份稳定的工作,这其实是一种平庸的表现,一代传一代,仅仅是保持着平庸而已。
我之前和我的父母说我想从一个小店开始创业的时候,我父母只是不断的打消我的念头,确实,我并没有什么能力去创业,也没有什么资本。但是最起码我的心从没有向着平庸而去。关于我还有很多事情,真的很体现出小市民的心态,趋于稳定才是最好的。我在自己的专业领域里确实是付出了,并且我会一直努力下去,我觉得再累我也可以克服。我一直觉得只有自己拼搏了,以后才不会后悔。等到10、20、30年之后,我希望看到成功的我。
扯的远了。总而言之,不要停留在舒服的空间里不动,只有在变化的社会中变化,你才能做到实现自己价值的第一步。

The most common reason programmers quit their jobs is because “it’s not challenging anymore since I’ve solved all the interesting problems.”
程序员辞职最常见的原因是“因为我已经解决了所有有趣的问题,所以不再具有挑战性了。”

学会把自己的行业当作自己的爱好。

五、在web开发中,有两个two inflection points

第一个是CRUD,你能够独立的去创建一个简单的应用程序,并且可以根据文档使用第三方库。

第二个是数据结构和算法,两者的重要性就不再这里说了,极其重要就对了。

当你越过inflection points会发现其实这并不重要,真正重要的是:
您对web开发框架有了坚实的了解
您对用任何编程语言编写复杂的算法代码都有扎实的掌握

六、Hiring managers want developers with solid web development and algorithm skills.

While I was working at PayPal, my team hired a Senior Rails Developer who had no experience in Rails– he had been coding a lot in Python, LISP, and Perl. Within a couple of days, he was already making a big impact. And within weeks: a huge impact. He quickly rose to become the technical team lead and was one of the best hiring decisions I’ve ever been involved in.
这是原文作者的经历。

七、你将在the Inflection Point中获得的技能

作为一个程序员,最好的参考资料就是曾经自己写过的代码,如果你完全理解你的代码,就能很快的进行编写,复习这块知识,将代码复用。所以在编写功能的时候,问自己之前是否写过相同或类似的功能。

八、尽快通过the Inflection Point的策略

平稳的完成这个过程。意在基础扎实、正确心态。

1、在教程阶段,暂停阅读结构化的材料,给自己一些挑战性的问题
  • 尝试学习超出课本以外的知识,也不是说你在学数学直接去学英语,就是让自己的脑子独立思考起来。
  • 尽可能少的使用教程,你应该尽可能的把知识当成习惯,记在脑子里面。如果每次都是一笔一划的看着书写代码,那么你想越过the Inflection Point基本上不可能。
  • 专注要点,重复使用。
2、一些建议
  • 在这个阶段,要保持正确的心态。
  • 坚持不懈的工作,但不要过度劳累。
  • 取得自信最好的方法就是摆脱你的怀疑。
九、怎样知道你越过了这个点呢

The final stage of the inflection point process is acceptance. Acceptance that software development is a process of continuous learning. Acceptance that the feeling that you’ve successfully learned everything just means you should start thinking about solving more complicated problems.
拐点过程的最后一个阶段是接受。接受软件开发是一个不断学习的过程。接受你已经成功学到了所有东西的感觉,这意味着你应该开始思考解决更复杂的问题。
这句话我还没有理解,应该是我还没有跨过这道坎吧。应该更努力一点。

TIP

Executor框架
最近学习Executor框架的博客。感觉时间有点不够用了,一来自己总结的慢,二来参加了一场cccc的现场赛,不过成绩不理想,又耽误学习时间,血亏TAT。

SHARE

漫画:什么是红黑树?

在另一篇博客中总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值