/**
* 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
*/
package javabasic.nowcoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Main39 {
/*
* 256代表所有的数字与大小写字母的总和,用一个数组来记录每一个字符串内容的次数就能解答。
*/
public int FirstNotRepeatingCharIII(String str) {
if(str.length()<=0||str==null) {
return -1;
}
char[] ch = str.toCharArray();
int[] record = new int[256];
for(int i=0;i<ch.length;i++) {
record[ch[i]]++;
}
for(int i=0;i<ch.length;i++) {
if(record[ch[i]]==1) {
return i;
}
}
return 0;
}
/*
* 利用map映射,存值与次数,再遍历将次数为1的取出,但是由于map是无序的,所以不能保证是字符串中第一个无重复,有点bug
*/
public int FirstNotRepeatingCharII(String str) {
if(str.length()<=0||str==null) {
return -1;
}
Map<Character,Integer> record = new HashMap<Character,Integer>();
char[] ch = str.toCharArray();
for(int i=0;i<ch.length;i++) {
if(!record.containsKey(ch[i])) {
record.put(ch[i], 1);
}else {
record.put(ch[i], record.get(ch[i])+1);
}
}
for(int i=0;i<ch.length;i++) {
if(record.get(ch[i])==1) {
return i;
}
}
return 0;
}
/*
* 自己写的一个时间复杂度高的
* 将每一位依次和原来的自己作比较,唯一值得注意的是要记得排除与本身比较
*/
public int FirstNotRepeatingChar(String str) {
if(str.length()<=0||str==null) {
return -1;
}
for(int i=0;i<str.length();i++) {
if(onlyOne(str.charAt(i),str,i)) {
return i;
}
}
return 0;
}
private boolean onlyOne(char charAt, String str, int i2) {
for(int i=0;i<str.length();i++) {
if(i==i2) {
continue;
}
if(charAt==str.charAt(i)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String str = "google";
int firstNotRepeatingChar = new Main39().FirstNotRepeatingCharIII(str);
System.out.println(firstNotRepeatingChar);
}
}