ARTS Week 1

Algorithm

本周的 LeetCode 题目为 189. 旋转数组

题目简介

给定一个数组,向右旋转 k 步,k 为非负数。示例如下:

输入数组 [1,2,3,4,5,6,7], k = 3
输出数组: [5,6,7,1,2,3,4]
解释:
旋转 1 步后得到: [7,1,2,3,4,5,6]
旋转 2 步后得到: [6,7,1,2,3,4,5]
旋转 3 步后得到: [5,6,7,1,2,3,4]

解法一:自己的想法

创建一个新数组用来存储结果。因为自己发现在旋转移动后 现nums[i] = 原nums[i + nums.length - k % nums.length],取模是因为当 k 大于 nums.length 时,移动 nums.length 和不移动没区别。通过的代码如下:

class Solution {
    public void rotate(int[] nums, int k) {
        if (nums.length <= 1) {
            return ;
        }

        int start = nums.length - k % nums.length;
        if (start == nums.length) {
            return ;
        }

        int[] temp = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            temp[i] = nums[i];
        }
        for (int i = 0; i < nums.length; i++) {
            nums[i] = temp[start];
            start = (start + 1) % nums.length;
        }
    }
}

但自己的代码并不简洁,存在一些改进的地方。

  1. 前面两处的判断有点儿冗余,可以去掉;
  2. 数组拷贝是循环赋值,经过了解后可以调用系统带有的函数;
  3. 自己习惯从 0 开始找规律,变化后的 nums[0] 等于什么,但表达起来复杂一些。

解法二:官方的解法一

和上面的代码思路一样,不同之处在于:

  1. 找规律时,反过来思考原来的 nums[0] 现在会是什么;
  2. 使用 System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 来拷贝数组。
class Solution {
    public void rotate(int[] nums, int k) {
        int[] ans = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            ans[(i+k) % nums.length] = nums[i];
        }
        System.arraycopy(ans, 0, nums, 0, nums.length);
    }
}

解法三:官方的解法三

通过数组翻转来进行,先翻转整个数组,然后再分别翻转 [0, k%nums.length - 1][k, nums.length] 两部分即可。用题目给的示例,如下:

操作结果
原来的数组[1,2,3,4,5,6,7]
全部翻转[7,6,5,4,3,2,1]
翻转 [0, 3][5,6,7,4,3,2,1]
翻转 [4, 7][5,6,7,1,2,3,4]
class Solution {
    private void reverse(int[] nums, int start, int end) {
        int temp = 0;
        while (start < end) {
            temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }

    public void rotate(int[] nums, int k) {
        reverse(nums, 0, nums.length-1);
        reverse(nums, 0, k % nums.length -1);
        reverse(nums, k % nums.length, nums.length-1);
    }
}

Review

本周 Review 的英文文章为:Happy birthday, Linux: From a bedroom project to billions of devices in 30 years

文章是庆祝 Linux 出现 30 周年, Greg Kroah-Hartman 接受 The Register 的采访记录(下面用 GK-H 代表 Greg Kroah-Hartman)。下面快速回顾这篇采访的内容。

先简单介绍了 Linux 内核。之后被问到 Linux 内核开发过程中遇到的最大挑战,GK-H 认为是开发模式,因为其拥有者众多的开发者和用户。目前 Linux 内核是采用基于时间的发布模式。

接下来问了有关 Linux 内核对 Rust 的整合。GK-H 介绍了可以通过 这篇摘要 来了解最新情况。目前 Linux 内核开发对 Rust 的态度是,“如果可能的话,使用 Rust 写新的代码。而不是替换现有的 C 代码”。

接着 GK-H 被问到是否会出现 Linux 内核的竞争品,像浏览器那样。GK-H 表示他希望在操作系统内核方面有一些真正的竞争。在 BSD 的开发者们没有去苹果前,他们之间存在不少合作,现在和 Google 的 Fuchsia 的开发者也有不少交流。

此外,GK-H 表示并不会去计划未来,而是走一步看一步根据新的架构作出相应调整。他也不会去参与讨论 Linux 为什么会成功、是否会受到地缘政治/民族主义等话题,而是专心放在代码和项目上。最后,GK-H 介绍了 Linux 内核给他带来了工作,环游世界,认识更多的朋友等等好处。

Tip

Java 中的每个基本类型都有其对应的包装类。如 intInteger。在创建 Integer 时,存在两种方法:

  1. Integer n = new Integer(100);
    2:Integer n = Integer.valueOf(100);

方法2 优于 方法1。因为方法1总是会创建新的 Integer 实例,而方法2会其内部优化留给 Integer 的实现者来做。

我们一般称 Integer.valueOf() 为静态工厂方法,它尽可能地返回缓存的实例以节省内存。在 Java 8 中,如果值的范围在 -128~127 之间,将会使用缓存进而减少时间(相关链接)。

Share

重新开始。ARTS 断更了一年半多,现在又重新拾起来了。在更新前把之前的文章都删掉了,忘掉过去,重新开始。最近三个月每个月初在朋友圈总结自己上个月的运动、阅读与输出的,以达到监督自己的目的。当自我曝光后,自己就会驱使自己,会约束自己来达到/接近一定目标,这就好比在没人关注时,一个人可能更无法约束自己,更容易暴露自己一些不好的方面,因为反正也没人注意到。

接下来的计划是,每周保证更新一篇 ARTS 的同时,再更新一篇其他文章,可能是技术相关,可能是阅读相关等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值