剑指offer面试题50:第一个只出现一次的字符(Java 实现)

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

测试用例:

  1. 功能测试:数组中存在或者不存在只出现一次的字符。
  2. 特殊测试:数组中全部都是只出现一次的字符。
  3. 负面测试:输入是数组为空。

方法一:暴力法,时间复杂度为 O(n²)。

思路:一个循环遍历数组中每一个字符,另一个循环比较拿遍历到的字符与后面的字符作比较,如果后面没有发现重复的字符,则该字符就是只出现一次的字符。

方法二:利用一个哈希表,以空间换时间,时间复杂度为 O(n),空间复杂度为O(1)。

思路:

  • 第一次循环找到数组中每一个字符出现的次数,并用哈希表对应表示,map<charAt(i),time>,时间为 O(n)。
  • 第二次循环是为了找到第一个只出现一次的字符,时间为 O(1)。
import java.util.LinkedHashMap;

public class test_fifty {
	public int FirstNotRepeatingChar(String str){
		LinkedHashMap<Character,Integer> map = new LinkedHashMap<Character,Integer>();
		
		//第一次循环找到数组中每一个字符出现的次数,并用哈希表对应表示
		for(int i=0; i < str.length();i++){
			if(map.containsKey(str.charAt(i))){
				int time = map.get(str.charAt(i));
				map.put(str.charAt(i), ++time);    //这里注意要先自增再赋值
			}
			else{
				map.put(str.charAt(i), 1);   //只出现一次的字符
			}
		}
		
		//第二次循环是为了找到第一个只出现一次的字符
		for(int i =0; i < str.length(); i++){
			char c = str.charAt(i);
			if(map.get(c) == 1){
				return i;
			}
		}
		return -1;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41163113/article/details/86656689