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