《剑指offer》编程-第一次只出现一次的字符

题目描述:

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

分析:

本题就是对一个给定的字符串找出第一个只出现一次的字符

要点:

1.只出现一次的字符 2.第一次出现 3.只由字母组成 4.区分大小写

思路:

因为字符串全是字母构成,因此对字符串中的字母进行频次统计时,可以构建26个字母专属的数组,(这里有一个坑,那就是区分大小写,就是得分别对大小写字母进行统计判别),① 对每个字母进行频次统计,并存放在数组中。② 然后再对字符串进行遍历,对每个遍历到的字母,到对应的字母频次数组中进行查询,如果出现频次为1,则立即返回其在字符串中的位置。

这里对于区分大小写的字母,我的做法是声明两个int[26]的数组,一个存放大写字母,另一个存放小写字母。

注意小写字母的ASCII值 是大于 大写字母的ASCII值的,因此比较时限定区间如“A~Z”比较稳妥。

代码:

public class Solution {
    	public int FirstNotRepeatingChar(String str) {
		int len = str.length();
		int fre[] = new int[26];
		int bfre[]=new int[26];
		int i = 0;
		int total = -1;

		while (i <= len - 1) {
			char tmp = str.charAt(i);	
			if (tmp>='A'&&tmp<='Z') {
				bfre[tmp - 'A']++;
			} 
			else {
				fre[ tmp - 'a']++;
			}	
			i++;
		}

		for (int j = 0; j < len; j++) {
			char tmp = str.charAt(j);
			if (tmp>='A'&&tmp<='Z') {
				if (bfre[tmp - 'A'] == 1) {
					return j;
				}
			} else {
				if (fre[tmp - 'a'] == 1) {
					return j;
				}
			}
		}

		return total;
	}
}
发布了52 篇原创文章 · 获赞 27 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_37457432/article/details/104939604