论坛首页 Java企业应用论坛

字符串中第一个无重复字符

浏览 10617 次
精华帖 (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;
	}



以前看的一个帖子的
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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

没错,我错了。没考虑到这种情况,新提供的那个方法好!
0 请登录后投票
   发表时间: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;
	}



以前看的一个帖子的

这个效率明显低。。
0 请登录后投票
   发表时间: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

0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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
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;
}
经过我的测试,我觉得还有比之前出现的效率都要高
0 请登录后投票
   发表时间: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码的字符了
0 请登录后投票
   发表时间: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内存....
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics