Leetcode537 Complex Number Multiplication Java实现
Posted chason95
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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方法:
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)。
以上是关于Leetcode537 Complex Number Multiplication Java实现的主要内容,如果未能解决你的问题,请参考以下文章
537. Complex Number Multiplication
537. Complex Number Multiplication
537. Complex Number Multiplication