字符串之第一次只出现一次的字符

1.本题知识点
   哈希表,ASCII码
2. 题目描述
  在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
3. 思路
   把字母的ASCII码值当成索引建立哈希表(通过ASCII码映射到内存中唯一存储位置,存储记录的数组叫散列表,即哈希表(HashTable), 哈希算法ASCII码)。
   Java版本:
package com.algorithm.array;

/**
 * 
 * @author wxq
 *
 */
public class FirstChar {

	public static void main(String[] args) {
		String str = "NXWtnzyoHoBhUJaPauJaAitLWNMlkKwDYbbigdMMaYfkVPhGZcrEwp";
		System.out.println(firstNotRepeatingChar(str));
	}
	
	/**
	 * 思路:把字母的ASCII码值当成数组索引
	 * @param str
	 * @return
	 */
	static int firstNotRepeatingChar(String str){
		//校验
		if(str == null || str.length() == 0) return -1;
		
		char [] arr = str.toCharArray();
		int size = 'z';//字母的ASCII码最大值
		int [] hashTable = new int [size+1];//因为索引是0 ~ size -1 => 0 ~ 121 ,所以如果输入z为122,下标越界
		
		//构造表,用ASCII码数组记录每个字母出现次数
		for(int i = 0 ; i  < arr.length; i++){
			hashTable[(int)arr[i]]++;
		}
		
		//查表,返回当前索引值
		for(int i = 0 ; i  < arr.length; i++){
			if(hashTable[(int)arr[i]] == 1)
				return i;
		}
		
		return -1;
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值