第一个只出现一次的字符

题目: 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。

 位置索引从0开始

//直观的思路:从头开始扫描这个字符串的每一个字符。当访问到某个字符时,拿这个字符和后面的每一个字符比较,如果在后面没有发现重复的字符,则该字符是只出现依次的字符。  时间复杂度是O(n方)。

另一种思路:用一个容器存放字符出现的次数。哈希表。HashMap 键值对 一个存放字符,一个存放次数。 扫描两遍。 时间复杂度O(n),空间复杂度也是O(n)。

//第一种思路; 
 public int firstNotRepeatingChar(String str) {
		 if(str.isEmpty()){
			 return -1;
		 }
		 char[] c=str.toCharArray();
	     for(int i=0;i<c.length;i++){
	    	 int j;//必须定义在这个位置 下面的if要用
	    	 for(j=0;j<c.length;j++){
	    		 if(i!=j && c[i]== c[j]){ 
	    			 break;
	    		 }
	    	 }
	    	 if(j==c.length){
	    		return i; 
	    	 }
	     }
		return -1;   
	 }


第二种: 
 public int firstNotRepeatingChar1(String str) {
		 if(str.isEmpty()){
			 return -1;
		 }
		 char[] c=str.toCharArray();
	    HashMap<Character,Integer> map=new HashMap<Character,Integer>();
	    for(int i=0;i<c.length;i++){
	    	if(map.containsKey(c[i])){
	    		map.put(c[i], map.get(c[i])+1);
	    	}else{
	    		map.put(c[i], 1);
	    	}
	    }
	    for(int i=0;i<c.length;i++){
	    	if(map.get(c[i])==1){ //在取出的时候,是按照字符的顺序c[i],取的,所以和hashMap有序无序无关
	    		return i;
	    	}
	    }
		return -1;   
	 }
public int firstNotRepeatingChar(String str) {
        HashMap<Character,Integer> map=new HashMap<Character,Integer>();
        int result=0;
        for(int i=0;i<str.length();i++){
        	char c=str.charAt(i);
        	if(map.containsKey(c)){
        		map.put(c, map.get(c)+1);
        	}else{
        		map.put(c,1);
        	}	
        }
       for(int i=0;i<str.length();i++){
    	   char c=str.charAt(i);
    	   if(map.get(c)==1){
    		   result= i;
    		   break;
    	   }
       }
       	return result;
    }
	 public int firstNotRepeatingChar2(String str) {
		 if(str.isEmpty()){
			 return -1;
		 }
	    HashMap<Character,Integer> map=new HashMap<Character,Integer>();
	    for(int i=0;i<str.length();i++){
        	char c=str.charAt(i);
        	if(map.containsKey(c)){
        		map.put(c,-2);
        	}else{
        		map.put(c,i);
        	}	
        }

	    int idx=Integer.MAX_VALUE;
	    int result=-1;
	    for(Map.Entry<Character,Integer> entry: map.entrySet()){
	    	if(entry.getValue()>=0 && entry.getValue()<idx){
	    		idx=entry.getValue();
	    		result=idx;
	    	}
	    }
		return result;   
	 }


 

你可能感兴趣的:(第一个只出现一次的字符)