题目:
如何最高效率最快的按空格进行拆分如下字符串,获得最长非空字符串的长度!
“aaaa ccsdf we iii ldkjl eee”
** 备注:有说用逗号隔开的字符串,或者别的什么隔开的字符串等等,都一样。**
参赛选手介绍:
1号选手split 号称史上最慢,来自java.lang.String家族,但用着就是香!真香
2号选手StringTokenier来自java.util家族,皇室血统,公认很快!真的快吗?
3号选手来自草根无名无姓,暂时叫EsayMethod,我自己想的也不是啥算法,思想是一次遍历出结果,时间复杂度O(n)!
本次实验需要拆分字符串长度为540000便于计算时间。
实际是aa bc aaaa aaa dd eeee hhhhhhhi www wee rrr rrr 33333 这样字符串循环拼接一万次。
一、 用split (** 结果-三次平均:44.6666**)
/**
* 方法一 split拆分遍历法
* 被人吐槽慢,咱今天就试试到底真慢假慢
* @param msg
* @return
*/
public static int splitMethod (String msg) {
String[] strArr = msg.split(" ");
for (String str : strArr) {
lastNum = str.length();
if(lastNum > maxNum) {
maxNum =lastNum;
}
}
return maxNum;
}
实验第一次用时38
实验第二次用时48
实验第三次用时48
二、用StringTokenizer(** 结果-三次平均:31.3333**)
/**
* 方法二 StringTokenizer
* 网上传说拆分字符串很快
* @param msg
* @return
*/
public static int stringTokenizerMethod (String msg) {
StringTokenizer stringTokenizer = new StringTokenizer(msg," ");
while (stringTokenizer.hasMoreElements()) {
lastNum = stringTokenizer.nextElement().toString().length();
if ( lastNum > maxNum ) {
maxNum = lastNum;
}
}
return maxNum;
}
实验第一次用时32
实验第二次用时26
实验第三次用时36
三、直接拆成字节数组,然后循环判断取最长(** 结果-三次平均:8.6666**)
/**
* 方法三 将字符串拆分成字节数组,遍历比大小
* 暂时咱们给他起名叫Esay方法
* @param msg
* @return
*/
public static int esayMethod (String msg) {
char[] newChar = msg.toString().toCharArray();
for(int i = 0;newChar.length >i; i++){
lastNum = i - beginNum;
if(newChar[i] == ' ' ){
if(lastNum != 0){
if(lastNum > maxNum){
maxNum =lastNum;
}
beginNum = i;
}
}
}
return maxNum-1;
}
实验第一次用时10
实验第二次用时8
实验第三次用时8
执行代码如下:
private static int maxNum = 0;
private static int beginNum = 0;
private static int lastNum = 0;
public static void main(String[] args) {
String str ="aa bc tttt aaa dd eeee hhhhhhhi www wee rrr rrr 33333 ";
StringBuffer sb = new StringBuffer();
for (int n = 0 ;n <10000 ; n++){
sb.append(str);
}
String msg = sb.toString();
System.out.println("开始:"+System.currentTimeMillis());
// System.out.println(splitMethod(msg));
System.out.println(esayMethod(msg));
// System.out.println(stringTokenizerMethod(msg));
System.out.println("结束:"+System.currentTimeMillis());
}
总结:
小伙伴们,有更好的参赛选手请留言啊!定会更新!
草根完胜两位高手
有更好算法的请留言,一起讨论,一起进步!