剑指offer--第一个只出现一次的字符
/** * 在一个字符串(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); } }