《剑指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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值