- Algorithm:每周至少做一个leetcode的算法题;
- Review:阅读并点评至少一篇英文技术文章;
- Tip/Tech:学习至少一个技术技巧;
- Share:分享一篇有观点和思考的技术文章;
Algorithm
945. 使数组唯一的最小增量
https://leetcode-cn.com/contest/weekly-contest-112/problems/minimum-increment-to-make-array-unique/ 题目:
- 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。
- 返回使 A 中的每个值都是唯一的最少操作次数。
- 示例 1:
- 输入:[1,2,2]
- 输出:1
- 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。
- 示例 2:
- 输入:[3,2,1,2,1,7]
- 输出:6
- 解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
- 可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。
- 提示:
- 0 <= A.length <= 40000
- 0 <= A[i] < 40000
这道题目不难,基本算是你只要找到规律轻松解决的类型注意3个点:
- 排序,排序之后,然后数组的每个位置上的数据可以根据当前的位置的index和数组的最小值(也就是排序后的数组第一个值)来计算要move几次。
- 设置最小值,以及增量,注意那个位置的值大于(index + A[0])的情况,这种情况下,你可以把这个位置的值当成之后的数组的最小值来进行计算,但是你要记得,在这个值这里index要重新设置为0。
- 注意空数组的情况(提交失败的教训啊)。
我晓得这样说还是太抽象,直接上代码吧,代码很短很简单,看懂问题不大,有更好的思路欢迎留言交流。
public static int minIncrementForUnique(int[] A) {
Arrays.sort(A);
int length = A.length;
if (length == 0) {
return 0;
}
int min = A[0];
int result = 0;
// 遍历的数组,并且注意j的值,j的值会在发现一个最小值的初始化为0。
for (int i = 0, j = 0; i < length; i++, j++) {
if (A[i] < min + j) {
result += (min + j) - A[i];
} else {
//当前值大于min+j的时候,说明发现了一个之后的数组的最小值。
min = A[i];
j = 0;
}
}
return result;
}
Review 阅读并点评至少一篇英文技术文章
How “Effective Java” may have influenced the design of Kotlin — Part 1
这篇文章讲了在Effective Java里的关于Java的优良的编码规范在Kotlin中如何去实现,因为Kotlin在Java的原来基础上做了很多改良,所以实现起来并不复杂,我看到这些代码都会觉得,这个代码是真的简单啊。
Tip/Tech:学习至少一个技术技巧
在Notepad++里面按住Alt键再移动鼠标可以进行竖向选择。
Share:分享一篇有观点和思考的技术文章
分享:关于逆商的一些文章以及总结: 上个礼拜的时候看了那个算法专栏里的周末福利的文章,文章的最后提到:一个人最后能不能成事其实和他的逆商大有关系,但是作者就放了一张图,却没有进行一些解释,我后来找了一些资料,大改了理解逆商,我们先看图:
接下来我们解释一下这个图的含义,逆商的核心就是CORE也就是图上的四个维度:
- Control 控制感:某人认为他可以在多大程度上影响接下来的问题的走向。简单来说,某人如果一直坚定的相信“我命由我不由天”那这个人的“Control”就是爆炸高的类型,反之,比如某人觉得,人生而有命,逆天改命是不可能的,那就是爆炸低的类型。
- Origin & Ownership 起因和责任归属:不管这个问题到底是不是自己原因,你会尽多大的努力来解决问题。有时候一个问题发生了,是自己原因,或者不是自己的原因,但是这个维度强的人会尽自己的全力去解决问题,不管发生这个问题是不是自己的原因,不管会产生多大的帮助,都要竭尽全力解决。
- Reach 影响范围:这个就简单了,比如学习上的问题不要去影响生活,事业上的情绪不要带入到家庭。这个维度高的人会吧问题的影响进行控制在一个小范围内,不会影响别的事情正常运行。
- Endurance 持续时间:这个维度高点的人会在较短的时间来解决问题,反之就一直回避,放任问题自由。