ARTS是什么? Algorithm:每周至少做一个LeetCode的算法题 Review:阅读并点评至少一篇英文技术文章 Tip:学习至少一个技术技巧,总结和归纳日常工作中遇到的知识点 Share:分享一篇有观点和思考的技术文章
Algorithm
完成leetcode算法第41题.
/**
* 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
*
* 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
*
*
* 示例 1:
*
* 输入:nums = [1,2,0]
* 输出:3
* 示例 2:
*
* 输入:nums = [3,4,-1,1]
* 输出:2
* 示例 3:
*
* 输入:nums = [7,8,9,11,12]
* 输出:1
* @author ouyb01
* @date 2021/12/27 13:00
*/
public class FirstMissingPositive41 {
/**
* 核心思路:置换。假如4在数组长度范围中,那么数组第4位(index=3)的位置将会被打上标记表示已出现,然后遍历数组,没有被标记的元素的下标+1则是答案。
* nums.length = 5;
* nums[i] = 4;
* if (0 <= nums[i] <= 5) {
* nums[4 - 1] = 标记
* }
*
*/
public int firstMissingPositive(int[] nums) {
// 极端情况N位数的数组[1,...N], 这时候未出现的正整数是N+1
// 遍历数组, 得到的数设为x, 如果x∈[1,N], 那么将数组下标为x的值做个标记, 如果都有标记, 则是上述说的极端情况, 否则是没有标记的值所在的下标+1
// 用负号当标记, 已标记的不重复标记
// 1. 数组中的负数赋值为N+1
for (int i = 0; i < nums.length; i++) {
if (nums[i] <= 0) {
nums[i] = nums.length + 1;
}
}
// 2. 判断x∈[1,N], 是则添加标记
for (int i = 0; i < nums.length; i++) {
// 有可能当前值已经被标记, 所以此处取绝对值
int index = Math.abs(nums[i]);
if (index >= 1 && index <= nums.length) {
// x∈[1,N], 添加标记, 已经被标记不能被重复标记, 所以取绝对值
nums[index-1] = -Math.abs(nums[index-1]);
}
}
// 3. 如果全有标记则最小值为N+1, 否则为第一个没有标记的下标+1
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
return i+1;
}
}
return nums.length + 1;
}
public static void main(String[] args) {
FirstMissingPositive41 example = new FirstMissingPositive41();
int[] nums = new int[]{7, 8, 9, 11, 12};
System.out.println(example.firstMissingPositive(nums));
}
}
Review
API & Web Architecture - Security Best Practices
Tip
- 架构设计的目的
- 为了解决软件系统复杂度带来的问题
- 通过熟悉和理解需求,识别系统复杂性所在的地方,然后针对这些复杂点进行架构设计
- 架构设计并不是要面面俱到,不需要每个架构都具备高性能、高可用、高扩展等特点,而是要识别出复杂点然后有针对性地解决问题
- 理解每个架构方案背后所需要解决的复杂点,然后才能对比自己的业务复杂点,参考复杂点相似的方案
Share
如何优雅地记录操作日志?
美团团队出品的2021年度最受欢迎文章。它介绍了几种方式以及优缺点并提出了目前在用的方式。我司现在的日志是直接侵入业务代码的,很不友好,看完这篇文章后收获很大,期待落地后的反馈。[
](https://www.yuque.com/yigenranshaodexiongmao/fgx0oh/vz15x7)
Finish
预计完成时间:2022.01.04 ~ 2022.01.09
实际完成时间:2022.01.08