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
判断的是 str1
、str2
两个字符串所指向的对象是否相同,而我们一般想判断相等是指它们的值是否相等,而不太关心是否是同一个对象。示例代码如下:
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,感觉有一些提高,但觉得自己的书面表达能力还有待提高,有时候为了表达自己的意思,但会很罗嗦,这是未来需要改进的。