ARTS Week 6

Algorithm

本周的 LeetCode 题目为 7. 整数反转

题目简介:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [\(−2^{31}\), \(2^{31} − 1\)] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。假设环境不允许存储 64 位整数(有符号或无符号)。例如:x=123 时返回 321,x=-1230 时返回 -321。

题目思路:题目关键要解决的地方在于需要判断反转后的数字是否溢出,但不能使用 64 位整数来处理。可以使用字符串来存储整数,通过比较字符串的大小来判断是否溢出。例如2147483647 是 int 的最大值,因为 "2147483648" > "2147483647" 因此可以判断出 2147483648 会出现溢出。同时可以先判断长度,因为比最大值短的数字(字符串)必然不会出现溢出。

最终代码

class Solution {
    public int reverse(int x) {
        if (x == 0) {
            return 0;
        }
        /**
         * 因为代码中存在 `x = -x`,
         * 而最小值为 `-2147483648`,最大值为 `2147483647`,
         * 最小值在进行 `x = -x` 会发生溢出,因此需要单独处理。
         */
        if (x == -2147483648) {
            return 0;
        }
        ArrayList<Integer> numberArr =  new ArrayList<>();
        int sign = 1;
        if (x < 0) {
            x = -x;
            sign = -1;
        }
        while (x != 0) {
            numberArr.add(x % 10);
            x = x / 10;
        }
        StringBuilder sb = new StringBuilder();
        if (sign == -1) {
            sb.append('-');
        }
        for (int number : numberArr) {
            sb.append(number);
        }
        String numStr = sb.toString();
        String maxIntStr = Integer.toString(Integer.MAX_VALUE);
        String minIntStr = Integer.toString(Integer.MIN_VALUE);
        if ((sign == 1) && (numStr.length() == maxIntStr.length()) && (numStr.compareTo(maxIntStr) > 0)) {
            return 0;
        } else if ((sign == -1) && (numStr.length() == minIntStr.length()) && (numStr.compareTo(minIntStr) > 0)) {
            return 0;
        } else {
            return Integer.parseInt(numStr);
        }
    }
}

Review

本周 Review 的英文文章为:软件工程中的“最佳实践”只是开发人员的个人偏好吗?

作者开篇先提到从事软件开发并不需要认证,不像医生、律师需要获取相应的执照才可以从业。那么软件开发的中的“最佳实践”是否也并不存在,而是“高级”工程师所想要的。接着作者以自己为例,在 Spring Boot REST API 中每一个服务类都被定义成一个接口,但这些类并不没有被继承,作者认为这样做是冗余的。再比如版本控制,什么时候使用 stash,什么时候 rebase 等等,这样的问题很难回答什么是最好的选择。

最后,作者认为编程的了去在于有众多的工具可以帮助实现同一个目标,日常中对技术栈和编码习惯的争论中,99%并不会影响最终结果。

Tip

Java 中判断字符串是否相等应该使用 str1.equals(str2),而不使用 str1 == str2,因为 str1 == str2 判断的是 str1str2 两个字符串所指向的对象是否相同,而我们一般想判断相等是指它们的值是否相等,而不太关心是否是同一个对象。示例代码如下:

public class Main {
    public static void main(String[] args) {
        String str1 = new String("Hello");
        String str2 = new String("Hello");
        System.out.println(str1 == str2); // false
        System.out.println(str1.equals(str2)); // true
    }
}

Share

已经成功写了一个月的 ARTS,感觉有一些提高,但觉得自己的书面表达能力还有待提高,有时候为了表达自己的意思,但会很罗嗦,这是未来需要改进的。

posted @ 2021-10-03 12:34  永远是萌新的阿岩  阅读(34)  评论(0编辑  收藏  举报