锁定老帖子 主题:字符串中第一个无重复字符
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-16
public static Character getFristChar2(String arg){ for( int i = 0 ; i < arg.length() ; i++){ if(arg.indexOf(String.valueOf(arg.charAt(i))) == arg.lastIndexOf(String.valueOf(arg.charAt(i)))){ return arg.charAt(i); } } return null; } 以前看的一个帖子的 |
|
返回顶楼 | |
发表时间:2010-04-16
chenyulong1 写道 楼主,方法名是FirstNoRepeated吧!
写了个看看行不行: public static Character FirstNoRepeated(String str){ for(int i=0;i<str.length();i++){ if(str.split(String.valueOf(str.charAt(i))).length==2) return new Character(str.charAt(i)); } return null; }; 这个应该不行吧,如果是字符串“bajhgb”,这样你得到的结果会是b |
|
返回顶楼 | |
发表时间:2010-04-16
lestin 写道 chenyulong1 写道 楼主,方法名是FirstNoRepeated吧!
写了个看看行不行: public static Character FirstNoRepeated(String str){ for(int i=0;i<str.length();i++){ if(str.split(String.valueOf(str.charAt(i))).length==2) return new Character(str.charAt(i)); } return null; }; 这个应该不行吧,如果是字符串“bajhgb”,这样你得到的结果会是b 没错,我错了。没考虑到这种情况,新提供的那个方法好! |
|
返回顶楼 | |
发表时间:2010-04-16
dasimm 写道 public static Character getFristChar2(String arg){ for( int i = 0 ; i < arg.length() ; i++){ if(arg.indexOf(String.valueOf(arg.charAt(i))) == arg.lastIndexOf(String.valueOf(arg.charAt(i)))){ return arg.charAt(i); } } return null; } 以前看的一个帖子的 这个效率明显低。。 |
|
返回顶楼 | |
发表时间:2010-04-16
最后修改:2010-04-16
import java.util.HashMap; import java.util.Map; public class TestChar { public static void main(String[] args) { String str = "adsfewvcxrewfdsfrewfdjyi" ; System.out.println(test1(str)) ; System.out.println(test2(str)) ; long startTime = System.nanoTime() ; for(int i=0;i<1000000;i++){ test1(str) ; } long endTime1 = System.nanoTime() ; for(int i=0;i<1000000;i++){ test2(str) ; } long endTime2 = System.nanoTime() ; System.out.println("Test1 use time:"+(endTime1-startTime)); System.out.println("Test2 use time:"+(endTime2-endTime1)); } public static Character test1(String str){ Character c = null ; for(int i=0;i<str.length() ;i++){ if(str.split(String.valueOf(str.charAt(i))).length==2){ return str.charAt(i) ; } } return null ; } public static Character test2(String str){ Map <Character,Integer> map = new HashMap<Character,Integer>(); for(int i=0; i<str.length();i++){ if(map.containsKey(str.charAt(i))){ map.put(str.charAt(i), 2); }else{ map.put(str.charAt(i), 1); } } for(int i=0; i<str.length();i++){ if(map.get(str.charAt(i))==1 ){ return str.charAt(i); } } return null; } } 运行结果: a a Test1 use time:2565346154 Test2 use time:3878041483 当循环数为10000时,运行结果: a a Test1 use time:83528214 Test2 use time:52959524 |
|
返回顶楼 | |
发表时间:2010-04-16
chenyulong1 写道 楼主,方法名是FirstNoRepeated吧!
写了个看看行不行: public static Character FirstNoRepeated(String str){ for(int i=0;i<str.length();i++){ if(str.split(String.valueOf(str.charAt(i))).length==2) return new Character(str.charAt(i)); } return null; }; 这个方法也有问题啊,要是想这样的“123213”字符串,结果应该是null,但是以上方法得到结果是3 |
|
返回顶楼 | |
发表时间:2010-04-16
LZ的就很快了,只不过因为Character到char的装箱卸箱会比较影响性能.
如果不考虑空间问题,倒是有个很耗空间的方法.不过可惜还是有if语句,怎么全用位运算搞定? 另外,现在所有的方法都是不准确的,因为根据String的定义,一个chatAt返回的char不一定是个完整字符,如果是增补字符还需要考虑代理项对 的问题.详细可以去看String类的javaDoc import java.util.HashMap; import java.util.Map; public class FirstNoRepeated { public static Character FirestNoRepeated(String str) { Map <Character,Integer> map = new HashMap<Character,Integer>(); for(int i=0; i<str.length();i++){ if(map.containsKey(str.charAt(i))){ map.put(str.charAt(i), 2); }else{ map.put(str.charAt(i), 1); } } for(int i=0; i<str.length();i++){ if(map.get(str.charAt(i))==1 ){ return str.charAt(i); } } return null; } public static Character FirestNoRepeated2(String str) { byte[] all = new byte[Character.MAX_VALUE- Character.MIN_VALUE+1]; int len = str.length(); for (int i = 0; i < len; i++) { if(all[str.charAt(i)]==0){ all[str.charAt(i)]=1; }else{ all[str.charAt(i)]=(byte) (all[str.charAt(i)]<<1); } } for (int i = 0; i < len; i++) { if(all[str.charAt(i)]==1) { return str.charAt(i); } } return null; } public static void main(String[] args) { StringBuilder sb = new StringBuilder(Character.MAX_VALUE - Character.MIN_VALUE + 100); //构造一个'快'最先出现的是'快'字的数据源 for (int i = Character.MIN_VALUE; i < Character.MAX_VALUE; i++) { sb.append((char)i); } for (int i = Character.MIN_VALUE; i < '快'; i++) { sb.append((char)i); } for (int i = '快'+1; i < Character.MAX_VALUE; i++) { sb.append((char)i); } String source = sb.toString(); System.out.println(source.length()); long st = System.currentTimeMillis(); System.out.println(FirestNoRepeated(source)); long ed = System.currentTimeMillis(); System.out.println("楼主的time use:"+ (ed -st)); st = System.currentTimeMillis(); System.out.println(FirestNoRepeated2(source)); ed = System.currentTimeMillis(); System.out.println("time use:"+ (ed -st)); } 运算结果: 131069 快 楼主的time use:172 快 time use:0 |
|
返回顶楼 | |
发表时间:2010-04-16
public static Character firstNoRepeated(String str){
int[] aa=new int[255]; for (int i=0; i<str.length();i++) { int c =str.charAt(i); aa[c]++; } for (int i : aa) { if(aa[i] ==1){ return (char)i; } } return null; } 经过我的测试,我觉得还有比之前出现的效率都要高 |
|
返回顶楼 | |
发表时间:2010-04-16
最后修改:2010-04-16
把我的上面一贴的数组长度稍微修改一下:
public static Character firstNoRepeated(String str){ int[] aa=new int[Character.MAX_VALUE - Character.MIN_VALUE + 100]; for (int i=0; i<str.length();i++) { int c =str.charAt(i); aa[c]++; } for (int i : aa) { if(aa[i] ==1){ return (char)i; } } return null; } 一开始我默认全部是ascii码的字符了 |
|
返回顶楼 | |
发表时间:2010-04-16
最后修改:2010-04-16
jqs7807151 写道 把我的上面一贴的数组长度稍微修改一下:
public static Character firstNoRepeated(String str){ int[] aa=new int[Character.MAX_VALUE - Character.MIN_VALUE + 100]; for (int i=0; i<str.length();i++) { int c =str.charAt(i); aa[c]++; } for (int i : aa) { if(aa[i] ==1){ return (char)i; } } return null; } 一开始我默认全部是ascii码的字符了 想法不错,但是每次都要初始化一个大约为60000+长度的数组。。。 根据我的估算,大概为250K内存.... |
|
返回顶楼 | |