Leetcode537 Complex Number Multiplication Java实现

没接触过在Java中对字符串进行寻找字符或者切片的操作,所以刚上手时感觉有点难受。后来翻看API确认了两种思路,方法1是用String.indexOf找到String里+和i的位置,之后使用String.substring方法得到切分后的两个子String,之后用Integer.valueOf,得到实部和虚部的两个数,进而进行乘法,最后通过String.format方法构建字符串即可。方法2是用String.split(regex)来分离字符。

先实现了方法1:

public class ComplexNumberMultiplication {
    //法1:用String.indexOf;法2:用String.split(regex)。之后用Integer.valueOf()。
    public static int[] getNumv1(String t) {
        int PLUSINDEX = t.indexOf("+");
        int iINDEX = t.indexOf("i");
        int[] x = new int[2];
        x[0] = Integer.valueOf(t.substring(0, PLUSINDEX));
        x[1] = Integer.valueOf(t.substring(PLUSINDEX+1, iINDEX));
        return x;
    }
    public String complexNumberMultiply(String a, String b) {
        int[] xa = getNumv1(a);
        int[] xb = getNumv1(b);
        int[] result = new int[2];
        result[0]=xa[0]*xb[0]-xa[1]*xb[1];
        result[1]=xa[0]*xb[1]+xa[1]*xb[0];
        String r = String.format("%d+%di",result[0],result[1]);
        return r;
    }
}

 使用正则表达式的split方法2:

    public static int[] getNumv2(String t) {
        String[] t1 = t.split("\\+|i");        //java首先将这个regex字符串解析为"\+|i"(字符串的自动解析),然后这个"\+|i"作为regex再代表"+|i"
        int[] x = new int[2];
        x[0] = Integer.valueOf(t1[0]);
        x[1] = Integer.valueOf(t1[1]);
        return x;
    }
    public String complexNumberMultiply(String a, String b) {
        int[] xa = getNumv2(a);
        int[] xb = getNumv2(b);
        int[] result = new int[2];
        result[0]=xa[0]*xb[0]-xa[1]*xb[1];
        result[1]=xa[0]*xb[1]+xa[1]*xb[0];
        String r = String.format("%d+%di",result[0],result[1]);
        return r;
    }
//    public static void main(String[] args) {
//        String t = "a+bi";
//        String[] t1 = t.split("\\+|i");
//        for (String s:t1) System.out.println(s.equals("")?"Nothing":s);
//    }

 

慢了很多,看来split或正则匹配效率并不高,追求速度尽量还用最原始的思路。

对方法1进行改进(很少,基本没有)得到方法3:

    public static int[] getNumv3(String t) {
        int PLUSINDEX = t.indexOf("+");
        int[] x = new int[2];
        x[0] = Integer.valueOf(t.substring(0, PLUSINDEX));
        x[1] = Integer.valueOf(t.substring(PLUSINDEX+1, t.length()-1));
        return x;
    }
    public String complexNumberMultiply(String a, String b) {
        int[] xa = getNumv3(a);
        int[] xb = getNumv3(b);
        int[] result = new int[2];
        result[0]=xa[0]*xb[0]-xa[1]*xb[1];
        result[1]=xa[0]*xb[1]+xa[1]*xb[0];
        String r = String.format("%d+%di",result[0],result[1]);
        return r;
    }

即不求i的index了,用t的length-1代替,发现提高了0.03%,没有提高太多,看来调用length也是需要循环的(?存疑),但是会比循环一边找index快一些。

再优化能咋优化?自己写valueOf方法?也不一定比原来的效率高呢。(限制在了[-100,100]速度可能会快一个if)。

参考大神Sagiri Izumi的方法,改进了最终得到结果String的方法,不用String.format改用StringBuilder,得到方法4,结果!

    public String complexNumberMultiply(String a, String b) {
        int[] xa = getNumv3(a);
        int[] xb = getNumv3(b);
        int[] result = new int[2];
        result[0]=xa[0]*xb[0]-xa[1]*xb[1];
        result[1]=xa[0]*xb[1]+xa[1]*xb[0];
        StringBuilder sb = new StringBuilder();
        sb.append(result[0]);sb.append('+');sb.append(result[1]);sb.append('i');
        return sb.toString();
    }

厉害了……String.format原来这么低效……有StringBuilder.format方法么?查了下,很不幸,没有。那有一些特殊需求时还得使用format啊。或者自己多加点ifelse,还用StringBuilder好了。

另外大神用了Integer.ParseInt,跟我的valueOf其实是一样的,因为valueOf其实调用的也是parseInt方法。

 

posted @ 2019-03-22 00:53  大胖子球花  阅读(205)  评论(0)    收藏  举报