Algorithm

题目描述

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

Example

输入123->true 输入-123->false 输入12->true

题目解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Solution2 {
    public boolean isPalindrome(int x) {

        if(x < 0) {
            return false;
        }

        if(x % 10 == 0 && x != 0) {
            return false;
        }

        int reverseNumber = 0;
        while (x > reverseNumber) {
            reverseNumber = reverseNumber * 10 + x % 10;
            x /= 10;
        }
        return reverseNumber == x || x == reverseNumber / 10;
    }
}

最简单暴力的方法是把int转换成String进行处理,String反转一半再与后续的进行比较,对于溢出的数字一定不是回文字。此方法则可以更快速的解决问题,关键是怎么找到当前数字的一半位置,可以使用当前数字pop与反转数字的push相比较,当push后的值大于pop后的值则说明到达了数字长度的一半了,对于奇数位的数字则可以使用reverseNumber/10来判断,因为中间的单个字默认就是回文字。此算法的时间复杂度为O(log(n)),空间复杂度为O(1)。

Review

code-small-null 本文是Idea的作者的代码味道系列的第一篇。这个系列特点是重构的理论与实践结合。对于JAVA程序员来说,对于NULL是再熟悉不过了,作者通过实践Morphia project 来演示处理NULL的情况。具体有几下几种情况:

NULL的含义

  1. 值从未被初始化
  2. 值是无效的
  3. 值是不需要的
  4. 值不存在
  5. 出现了其它的严重问题,应该出现的值没有出现
  6. 其它的情况等等

JAVA8的Optional可以解决NULL问题吗?

其实Optional只能解决上面提到的第4点,即值不存在。比如在一个请求DB查询的情况,如果查询的东西不存在,则使用Optional可以更好的表示结果。

示例1中if(null) return null

这种情况判断要处理的值为null,又返回了null,其实这种情况可以前置null的检查,在统一入口进行处理。如果在一个基础库中确认要处理的入参不可以为null可以使用Idea的@NotNull注解来进行标识,这样Idea在进行编译时会对整个调用链进行检查。如果重构后不想用注解了,则可以在代码入版本库前删除注解。这里面Idea的inspection功能很强大,它可以根据要检查的名字来显示里面的问题,并提供处理方案。

示例2中Converter.encode()

此方法功能为编码,此时return null不友好,如果没有返回的话就可以使用Optional.empty()来处理。

示例3的Mapper.getId()

这里面有多个地方返回null,尤其是在catch异常中也返回了null,这样使得返回的语义有歧义,这时使用optional是不能解决问题的,只有抛出明确的异常信息才是明智的处理方式。不要为了不报错而不报错。

总结

作者认为NULL会代表不同的情况,主要的问题是NULL不能表示出了什么问题,造成它的情况有很多。可能的解决方案为:

  1. Optional当方法要表示不存在时
  2. @NotNull/@Nullable注解显示标明来让Ide来辅助进行检查
  3. 异常处理,当遇到异常时可以抛出一个有明确信息的异常会更友好
  4. 对于字段级别的null值如果可以表示其含义则可以进行使用

最后的最后

完整的重构是需要充足的单元测试做支撑

Tip

今天分享一下Mac下处理.DS_Store文件的三板斧

Mac设置不生成此文件

1
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true

find命令自行处理

1
find . -type f -name ".DS_Store" -delete

m-cli工具加强处理

使用m-cli工具

1
2
m dir delete dsfiles
m dir delete dsfiles /path

Share

今天分享medium上的一篇对比20年前后软件开发的变化的文章。主要讲述了20年前的理论模型在20年后得到实践应用,JAVA在这20年间依旧平稳给力,并行与异步在当下成为许多语言标配。How is computer programming different today than 20 years ago?