剑指offer--第一个只出现一次的字符

/**
 * 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
 */
package javabasic.nowcoder;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Main39 {
	
	/*
	 * 256代表所有的数字与大小写字母的总和,用一个数组来记录每一个字符串内容的次数就能解答。
	 */
	public int FirstNotRepeatingCharIII(String str) {
		if(str.length()<=0||str==null) {
			return -1;
		}
		
		char[] ch = str.toCharArray();
		int[] record = new int[256];
		for(int i=0;i<ch.length;i++) {
			record[ch[i]]++;
		}
		
		for(int i=0;i<ch.length;i++) {
			if(record[ch[i]]==1) {
				return i;
			}
		}
		
		return 0;
    }
	
	/*
	 * 利用map映射,存值与次数,再遍历将次数为1的取出,但是由于map是无序的,所以不能保证是字符串中第一个无重复,有点bug
	 */
	public int FirstNotRepeatingCharII(String str) {
		if(str.length()<=0||str==null) {
			return -1;
		}
		Map<Character,Integer> record = new HashMap<Character,Integer>();
		char[] ch = str.toCharArray();
		
        for(int i=0;i<ch.length;i++) {
        	if(!record.containsKey(ch[i])) {
        		record.put(ch[i], 1);
        	}else {
        		record.put(ch[i], record.get(ch[i])+1);
        	}
        }
        
        for(int i=0;i<ch.length;i++) {
        	if(record.get(ch[i])==1) {
        		return i;
        	}
        }
        
		return 0;
    }
	
	/*
	 * 自己写的一个时间复杂度高的
	 * 将每一位依次和原来的自己作比较,唯一值得注意的是要记得排除与本身比较
	 */
	public int FirstNotRepeatingChar(String str) {
		if(str.length()<=0||str==null) {
			return -1;
		}
        for(int i=0;i<str.length();i++) {
        	if(onlyOne(str.charAt(i),str,i)) {
        		return i;
        	}
        }
        
		return 0;
    }
	
	private boolean onlyOne(char charAt, String str, int i2) {
		for(int i=0;i<str.length();i++) {
			if(i==i2) {
				continue;
			}
			if(charAt==str.charAt(i)) {
				return false;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		String str = "google";
		int firstNotRepeatingChar = new Main39().FirstNotRepeatingCharIII(str);
		System.out.println(firstNotRepeatingChar);
	}
}

  

posted @ 2018-05-24 10:48  dreamy_java  阅读(395)  评论(0编辑  收藏  举报