写点什么

String split() 方法踩坑

用户头像
梁小航航
关注
发布于: 1 小时前

split(String regex) 方法的作用是将字符串根据 regex 分割成 String[]

注意:支持正则表达式

和往常一样进行今天的每日一题

https://leetcode-cn.com/problems/compare-version-numbers/


这一看就是切割字符串然后转换整数进行比较,version1 > version2 返回 1; version1 < version2 返回-1; 比较到最后都相等返回 0;

class Solution {    public int compareVersion(String version1, String version2) {        String[] v1 = version1.split(".");        String[] v2 = version2.split(".");        int length1 = v1.length;        int length2 = v2.length;        for (int i = 0; i < (length1 > length2 ? length1:length2); i++) {            int num1 = 0;            int num2 = 0;            if (i < length1) {                num1 = Integer.parseInt(v1[i]);            }            if (i < length2) {                num2 = Integer.parseInt(v2[i]);            }            if (num1 > num2) {                return 1;             } else if (num1 < num2){                return -1;            }        }        return 0;    }}
复制代码


速度很快写完了,但是发现用例 "1.0.1""1" 竟然没办法通过。

只能 debug 调试,发现 split()方法并没有截取出我想要的三部分。v1 和 v2 的结果都是[]。

有点想不通只能查看一下源码

发现在单个字符作为分隔符分割的时候他会判断一下这个字符是否是".$|()[{^?*+\"这些特殊符号,如果是这些符号则认为不是单字符,直接进入正则表达式分割。

这时候明白了这些字符是正则表达式里使用的字符,不能直接作为分割符需要进行转义。

class Solution {    public int compareVersion(String version1, String version2) {        String[] v1 = version1.split("\\.");        String[] v2 = version2.split("\\.");        int length1 = v1.length;        int length2 = v2.length;        for (int i = 0; i < (length1 > length2 ? length1:length2); i++) {            int num1 = 0;            int num2 = 0;            if (i < length1) {                num1 = Integer.parseInt(v1[i]);            }            if (i < length2) {                num2 = Integer.parseInt(v2[i]);            }            if (num1 > num2) {                return 1;             } else if (num1 < num2){                return -1;            }        }        return 0;    }}
复制代码


用户头像

梁小航航

关注

还未添加个人签名 2019.01.23 加入

爱而不得的人

评论

发布
暂无评论
String split()方法踩坑