两种Java题解-利用Map或数组
第一个只出现一次的字符
http://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c
import java.util.ArrayList;
import java.util.HashMap;
public class Solution {
// public int FirstNotRepeatingChar(String str) {
// //思路:这必然是要遍历所有的元素的,在遍历的过程中,将字母存入map中
// //key为这个字母,value为这个字母出现的次数.
// //然后再此遍历,返回第一个为1的i即可
// if(str== null || str.length()==0){
// return -1;
// }
// HashMap<Character,Integer> map = new HashMap<>();
// // char[] c = str.toCharArray();
// for(int i= 0; i < str.length();i++){
// if(map.containsKey(str.charAt(i))){
// map.put(str.charAt(i),map.get(str.charAt(i))+1);
// }else{
// map.put(str.charAt(i),1);
// }
// }
// for(int i= 0;i<str.length();i++){
// if(map.get(str.charAt(i)) ==1){
// return i;
// }
// }
// return -1;
// }
public int FirstNotRepeatingChar(String str) {
//这一步数组长度设为128,是因为,在所有的字符编码中大写字母(A-Z: 65-90),小写字母(a-z: 97-122)
//我们会发现,如果小于122,可能会报数组越界的异常
int[] ints = new int[128];
for (int i = 0; i < str.length(); i++) {
//这一步的意思是;
// 虽然我们每次得到的是一个char类型的字符,但是这个字符可以用来作为数组的索引下标
//也就是,我们把每个英文字符当做一个map的key,即这里的数组索引下标,而数组中实际存储的是这个字符出现的次数
//有相同的字符,也就是定位到数组的已有的那个位置,然后将其存储的实际数值加1
char c = str.charAt(i);
ints[c] = ints[c] + 1;
}
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (ints[c] == 1) {
return i;
}
}
return -1;
}}
查看13道真题和解析