1. 程式人生 > >劍指offer:(35)時間效率和空間效率的平衡 :第一個只出現一次的字元

劍指offer:(35)時間效率和空間效率的平衡 :第一個只出現一次的字元

在一個字串(1<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置。

package co.com.jianzhioffer;

import java.util.HashMap;
import java.util.Map;



public class Solution35 {
	//方法一,建立一個hashMap來記錄字元值及其對應的次數,
	//然後遍歷字串,如果出現某個字元的次數為1,則輸出其索引位置
	public static int FirstNotRepeatingChar(String str){
		if(str==null||str.length()<=0) return -1;
		Map<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, map.get(c)+1);
			}else{
				map.put(c, 1);
			}
		}		
		int i = 0;
		for(;i<str.length();i++){
			char c = str.charAt(i);
			if(map.get(c)==1){
				return i;
			}
		}
		return -1;
	}
	
	//方式二:將字串轉成一個字元陣列,再另外建立一個大小為‘z’的陣列,實現一種索引位置為字元所對應的ASCII值,存的是字元的次數
	//然後遍歷字元陣列,如果出現某個字元的次數為1,則輸出其索引位置
	public static int FirstNotRepeatingChar(String str){
		char[] charArray = str.toCharArray();
		int[] a = new int['z'];
		for(char ch:charArray){
			a[(int) ch]++;
		}
		
		for(int i =0;i<charArray.length;i++){
			if(a[(int) charArray[i]] ==1){
				return i;
			}
		}
		return -1;
	}
	
	
	public static void main(String[] args) {
		System.out.println(FirstNotRepeatingChar(""));
		
	}

}