ARTS_01 —— 23.8.7~8.13

331 阅读6分钟

1.Algorithm

8.15 号 LeetCode 每日一题:833. 字符串中的查找与替换

详情请看:833. 字符串中的查找与替换 - 力扣(LeetCode)

主要的 trick 是:在不改变原数组 originalArr 的前提下,为该数组进行排序;主要的方式是新建一个数组 newArr,数组元素是原数组的索引值,然后对新数组进行排序,根据当前索引值所对应的originalArr 中的元素值的大小进行排序。

之后根据题目要求进行模拟,得到最终答案。

public String findReplaceString(String s, int[] indices, String[] sources, String[] targets) {
    int n = s.length(),m = indices.length;
    // trick
    List<Integer> ops = new ArrayList<>();
    for(int i=0;i<m;i++){
        ops.add(i);
    }
    ops.sort((a,b) -> indices[a]-indices[b]);
    
    // 模拟
    StringBuilder ans = new StringBuilder();
    int pt = 0;
    for(int i=0;i<n;i++){
        if(pt>=m || indices[ops.get(pt)]>i){
            ans.append(s.charAt(i));
        }else{
            boolean success = true;
            int index = i,len = sources[ops.get(pt)].length();
            while(index < i+len){
                if(index>=n || s.charAt(index)!=sources[ops.get(pt)].charAt(index-i)){
                    success = false;
                    break;
                }
                index++;
            }
            if(success){
                ans.append(targets[ops.get(pt)]);
                // 跳过原字符串中已匹配的字符
                i += len - 1;
            }else{
                // 当前字符需要被添加进 ans 中,所以需要消耗掉 for 的自增
                i--;
            }
            pt++;
        }
    }
    return ans.toString();
}

2.Review

10 Life-Changing Books Every Developer Should Read | by Aman Bhatia | Medium

介绍了开发者应该阅读的 10 本书籍:

  • The Phoenix Project
    • 本书讲述了一家公司在 IT 和项目管理问题上苦苦挣扎的故事,以及他们如何利用 DevOps 原则来改造他们的组织。 它提供了改进 IT 运营的实用建议和现实示例。
    • 亚马逊链接:Click
  • Soft Skills
    • 本书涵盖了与软件开发相关的一系列主题,包括职业发展、生产力和沟通。 它提供实用的建议和练习,以提高您的技能和推进您的职业生涯。
    • 亚马逊链接:Click
  • The Art of Computer Programming
    • 这本经典书籍是计算机编程的综合指南。它涵盖了算法、数据结构和语言设计等主题,并提供了实际示例和练习。
    • 亚马逊链接:Click
  • Code
    • 这本书对计算机的历史和内部工作原理进行了精彩的介绍。 它涵盖了二进制代码、逻辑门和汇编语言等主题,并提供了对计算机系统的基础理解。
    • 亚马逊链接:=Click
  • The Innovator’s Dilemma
    • 本书提供了对商业世界创新和颠覆的见解。 它涵盖了技术采用、市场进入和竞争策略等主题,并提供了现实世界的示例和案例研究。
    • 亚马逊链接:Click
  • Peopleware
    • 本书提供了有关团队动态和项目管理的见解。 它涵盖了团队建设、沟通和领导力等主题,并为创建高效团队提供了实用建议。
    • 亚马逊链接:Click
  • Drive
    • 这本书提供了对动机和人类行为的见解。 它涵盖了内在动机、自主性和目的等主题,并为激励自己和他人提供了实用的建议。
    • 亚马逊链接:Click
  • The Lean UX
    • 本书提供了有关敏捷开发环境中的用户体验设计的见解。 它涵盖了用户研究、原型设计和测试等主题,并为创建出色的产品提供了实用的建议。
    • 亚马逊链接:Click
  • The Effective Engineer
    • 本书提供了有关软件工程的生产力和影响的见解。 它涵盖了时间管理、优先顺序和职业发展等主题,并提供了产生有意义的影响的实用建议。
    • 亚马逊链接:Click
  • Thinking, Fast and Slow
    • 这本书提供了对人类认知和决策的见解。 它涵盖了偏见、启发式和思想本质等主题,并提供了做出更好决策的实用建议。
    • 亚马逊链接:Click

3.Technique/Tips

《重学设计模式》———— 责任链模式

责任链模式可以让各个服务模块更加清晰,而每⼀个模块间可以通过 next 的方式进行获取。

书中场景:多级审批的场景。将审批流程分为一级、二级、三级等,不同等级的审批由不同的责任人负责。审批的流程固定,例如先由组长审批通过,才流转到经理审批;经理审批通过,才能够让总经理进行审批。

实现:定义一个审批抽象类;每个等级的审批代表一个实现类,通过 next 属性将各个等级审批连接起来。

public abstract class AuthLink {
    // 级别人员ID
    protected String levelUserId; 
    // 级别人员姓名
    protected String levelUserName;
    // 责任链
    private AuthLink next;                                  

    public AuthLink(String levelUserId, String levelUserName) {
        this.levelUserId = levelUserId;
        this.levelUserName = levelUserName;
    }

    public AuthLink next() {
        return next;
    }

    public AuthLink appendNext(AuthLink next) {
        this.next = next;
        return this;
    }
    // 审批
    public abstract AuthInfo doAuth(String uId, String orderId, Date authDate);

}
public class Level1AuthLink extends AuthLink {}
public class Level2AuthLink extends AuthLink {}
public class Level3AuthLink extends AuthLink {}
// 使用
AuthLink authLink = new Level3AuthLink("1000013", "王工")
        .appendNext(new Level2AuthLink("1000012", "张经理")
                .appendNext(new Level1AuthLink("1000011", "段总")
                                                          )
                   );

未命名绘图.drawio.png

4.Share

96 | 高效学习:端正学习态度 (geekbang.org)

今日阅读了耗子叔的这篇文章,对文中的一些观点进行记录。

  • 学习是一件“逆人性”的事,就像锻炼身体一样,需要人持续付出,会让人感到痛苦,并随时想找理由放弃
    • 如果在学习过程中并未体会到这种感受,是否意味着自身从未走出舒适区,向自己的未知进行挑战
  • 大部分人都认为自己热爱学习,但是:动力不足-只有意识没有行动;缺乏方向和目标-不知道自己该学什么;没有正确的方法和技能-不具备自主学习的能力;缺乏实践和坚持
    • 反思自身;自己也存在这样的情况,知道要努力,要学习,但动力不足,效率不够;没有掌握正确的学习方法,导致时间利用率低
  • 学习分为被动学习主动学习
    • 被动学习:如听讲、阅读、学习等,这些方式的知识留存率都在 30% 以下
    • 主动学习:如讨论、实践、教授他人等,这些方式的知识留存率都达到 50% 以上,尤其是通过教授他人的方式(费曼学习法),其知识留存率可以达到 90%
  • 学习不是努力读更多的书,盲目追求阅读的速度和数量,这会让人产生低层次的勤奋和成长的感觉,这只是在使蛮力。要思辨,要践行,要总结和归纳,否则,你只是在机械地重复某件事,而不会有质的成长的。
  • You do not know what you do not know
    • 你不会知道你不知道的事。你都不知道其存在,又怎么能够学习它。
    • 所以要多和他人交流、公事,去发现自己的短板和缺失
  • 学习的目的
    • 学习不仅仅是为了找到答案,而更是为了找到方法
      • 学习到相应的方法,才能够以不变应万变
    • 学习不仅仅是为了知道,而更是为了思考和理解
      • 只有通过思考和理解,才能够去深层次的探索事物的本质,而不是留于表面
    • 学习不仅仅是为了开拓眼界,而更是为了找到自己的未知,为了了解自己
      • 只有通过学习,去接触更多的事,才能够有机会去知道自己的边界和未知,从而更加了解自己
    • 学习不仅仅是为了成长,而更是为了改变自己,改变自己的思考方式,改变自己的思维方式
      • 思维方式就像算法优化,应当通过学习去掌握更加高效的思考方式,从而提高自己的解决问题的能力