題目描述:java
在一個字符串(0<=字符串長度<=10000,所有由字母組成)中找到第一個只出現一次的字符,並返回它的位置, 若是沒有則返回-1(須要區分大小寫).數組
思路分析:
方法一:
我的思路
比較粗暴,將字符串轉換成字符數組,按順序遍歷字符數組。須要兩個指針,指針1指向首次出現的字符,指針2從指針1的位置日後遍歷,找出與指針1相同的字符。
1,新建一個HashSet集合,用於存儲已經重複出現的字符;
2,先判斷指針位置上的元素是否包含在重複字符的集合中,若是重複指針1直接跳到下一個位置。繼續2過程。
3,若元素沒有包含在Set集合中,則指針2從指針1位置依次日後遍歷,判斷是否有相同的字符出現,如有相同的元素出現,則將該元素存入Set集合中,指針1指向下一個元素。繼續用2過程。
4,若指針2到達字符數組末尾時還未發現重複字符,則直接返回指針1位置的字符便可。
5,若遍歷完整個數組都沒找出出現一次的字符,則返回-1;指針
代碼實現以下:code
import java.util.HashSet; public class Solution { public int FirstNotRepeatingChar(String str) { if(str == null || str.length()< 1){ return -1; } char[] ch = str.toCharArray(); HashSet<Character> set = new HashSet<Character>(); for(int i = 0 ; i < str.length()-1; i++){ for(int j = i+1 ; j < ch.length;j++){ if(set.contains(ch[i])){ break; } if(ch[i]==ch[j]){ set.add(ch[i]); break; } if(j==ch.length-1){ return i; } } } return -1; } }
方法2:
參考牛客網上大佬的思路:
連接:https://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c
來源:牛客網
說一下解題思路哈,其實主要仍是hash,利用每一個字母的ASCII碼做hash來做爲數組的index。首先用一個58長度的數組來存儲每一個字母出現的次數,爲何是58呢,主要是因爲A-Z對應的ASCII碼爲65-90,a-z對應的ASCII碼值爲97-122,而每一個字母的index=int(word)-65,好比g=103-65=38,而數組中具體記錄的內容是該字母出現的次數,最終遍歷一遍字符串,找出第一個數組內容爲1的字母就能夠了,時間複雜度爲O(n)字符串
代碼實現以下:hash
public class Solution { public int FirstNotRepeatingChar(String str) { int[] words = new int[58]; for(int i = 0;i<str.length();i++){ words[((int)str.charAt(i))-65] += 1; } for(int i=0;i<str.length();i++){ if(words[((int)str.charAt(i))-65]==1) return i; } return -1; } }