题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
HashMap 导包版
import java.util.*;
public class Solution {
public int FirstNotRepeatingChar(String str) {
HashMap <Character,Integer> map = new HashMap< >();
for (int i=0; i<str.length();i++ ){
char key = str.charAt(i);
Integer nun = map.get(key);
//将字符存入HashMap,从0开始计数
if(nun==null){
map.put(key,0);
}else{
nun++;
map.put(key,nun);
}
}
for (int i=0;i<str.length();i++){
int nun = map.get(str.charAt(i));
//第一个只出现一次的字符,只出现一次,并且从0开始计数。
if(nun==0){
return i;
}
}
return -1;
}
//return -1;
}
不使用HashMap(不导包)
此处粘贴别人代码
https://blog.nowcoder.net/n/a947a8ea149046f8af09c8c35f37753a?f=comment
补充说明:
for(int i=0; i < str.length();i++)
count[str.charAt(i)]++;
当时没看懂的一点:
首先str.charAt(i)获得的是str中索引为i的字符,当时没懂int类型的数组为什么可以通过字符来访问。代码实际运行中此处其实完成了一个强制类型转换,以apple为例,当第一个字符a被读取时,count[‘a’]中的’a’被强制转换为97,所以本句相当于是count[(int)(‘a’)] .实际是count[97]suo 对应的值进行了++操作。
此处感谢本人男票的友情指导 ——一个比我这个渣渣适合做码农但是不愿意做码农但是也保不住头发的憨憨(手动狗头)
附:强制类型转换相关内容
强制类型转换
当两种类型彼此不兼容,或者目标类型的取值范围小于源类型,自动转换无法进行,这时就需要进行强制类型转换。强制类型转换的通用格式如下:
目标类型 变量=(目标类型)值;
高级数据要转换成低级数据,需用到强制类型转换
如:int i = 256; byte b = (byte) i; b=?
表达式数据类型的自动提升
如果在JAVA应用程序表达式中出现数据类型不一致的情形,那么JAVA运行时系统首先自动将低优先级类型的数据转换成高优先级类型的数据,然后才进行表达式值的计算。
自动类型转换
整型,实型,字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级。
自动类型转变,需要同时满足两个条件,第一是两种类型彼此兼容,第二是目标类型的取值范围大于源类型。
例如,当byte型向int型转换时,由于int型的取值范围大于byte型,就会发生自动转换。