ARTS是什么? Algorithm:每周至少做一个LeetCode的算法题 Review:阅读并点评至少一篇英文技术文章 Tip:学习至少一个技术技巧,总结和归纳日常工作中遇到的知识点 Share:分享一篇有观点和思考的技术文章

Algorithm

完成leetcode算法第41题.

  1. /**
  2. * 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
  3. *
  4. * 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
  5. *
  6. *
  7. * 示例 1:
  8. *
  9. * 输入:nums = [1,2,0]
  10. * 输出:3
  11. * 示例 2:
  12. *
  13. * 输入:nums = [3,4,-1,1]
  14. * 输出:2
  15. * 示例 3:
  16. *
  17. * 输入:nums = [7,8,9,11,12]
  18. * 输出:1
  19. * @author ouyb01
  20. * @date 2021/12/27 13:00
  21. */
  22. public class FirstMissingPositive41 {
  23. /**
  24. * 核心思路:置换。假如4在数组长度范围中,那么数组第4位(index=3)的位置将会被打上标记表示已出现,然后遍历数组,没有被标记的元素的下标+1则是答案。
  25. * nums.length = 5;
  26. * nums[i] = 4;
  27. * if (0 <= nums[i] <= 5) {
  28. * nums[4 - 1] = 标记
  29. * }
  30. *
  31. */
  32. public int firstMissingPositive(int[] nums) {
  33. // 极端情况N位数的数组[1,...N], 这时候未出现的正整数是N+1
  34. // 遍历数组, 得到的数设为x, 如果x∈[1,N], 那么将数组下标为x的值做个标记, 如果都有标记, 则是上述说的极端情况, 否则是没有标记的值所在的下标+1
  35. // 用负号当标记, 已标记的不重复标记
  36. // 1. 数组中的负数赋值为N+1
  37. for (int i = 0; i < nums.length; i++) {
  38. if (nums[i] <= 0) {
  39. nums[i] = nums.length + 1;
  40. }
  41. }
  42. // 2. 判断x∈[1,N], 是则添加标记
  43. for (int i = 0; i < nums.length; i++) {
  44. // 有可能当前值已经被标记, 所以此处取绝对值
  45. int index = Math.abs(nums[i]);
  46. if (index >= 1 && index <= nums.length) {
  47. // x∈[1,N], 添加标记, 已经被标记不能被重复标记, 所以取绝对值
  48. nums[index-1] = -Math.abs(nums[index-1]);
  49. }
  50. }
  51. // 3. 如果全有标记则最小值为N+1, 否则为第一个没有标记的下标+1
  52. for (int i = 0; i < nums.length; i++) {
  53. if (nums[i] > 0) {
  54. return i+1;
  55. }
  56. }
  57. return nums.length + 1;
  58. }
  59. public static void main(String[] args) {
  60. FirstMissingPositive41 example = new FirstMissingPositive41();
  61. int[] nums = new int[]{7, 8, 9, 11, 12};
  62. System.out.println(example.firstMissingPositive(nums));
  63. }
  64. }

Review

API & Web Architecture - Security Best Practices

Tip

  1. 架构设计的目的
    • 为了解决软件系统复杂度带来的问题
    • 通过熟悉和理解需求,识别系统复杂性所在的地方,然后针对这些复杂点进行架构设计
    • 架构设计并不是要面面俱到,不需要每个架构都具备高性能、高可用、高扩展等特点,而是要识别出复杂点然后有针对性地解决问题
    • 理解每个架构方案背后所需要解决的复杂点,然后才能对比自己的业务复杂点,参考复杂点相似的方案

      Share

      如何优雅地记录操作日志?
      美团团队出品的2021年度最受欢迎文章。它介绍了几种方式以及优缺点并提出了目前在用的方式。我司现在的日志是直接侵入业务代码的,很不友好,看完这篇文章后收获很大,期待落地后的反馈。[

](https://www.yuque.com/yigenranshaodexiongmao/fgx0oh/vz15x7)

Finish

预计完成时间:2022.01.04 ~ 2022.01.09
实际完成时间:2022.01.08