一開始想用HashMap,把每個字符放進去,然后統計出現的次數。
使用LinkedHashMap的話,鍵值對的順序都是不會變的。
LinkedHashMap<Character,Integer> map = new LinkedHashMap<>();map.put('i',1111);map.put('j',2222);map.put('k',3333);map.put('l',4444);//LinkedHashMap的values也是按key的順序嗎?Collection<Integer> values = map.values();Iterator<Integer> iterator = values.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}
?
輸出的值是1111,2222,3333,4444
?
所以按照題目,只要判斷出第一個出現次數為1的字符即可。
?
但是,無法找到正確的下標。
?
比如aaabbbbcaaad。
怎么知道c的下標呢?
很難。
?
最好的辦法就是自定義一個數據結構,Map里面存這個結構
public static class Node{//值public char val;//第一次出現的下標public int index;//出現的次數public int count;public Node(char val,int index,int count){this.val = val;this.index = index;this.count = count;}}
?
這樣,就能按照出場順序記錄每個字符了。相對位置是絕對正確的
還能獲取他們的個數。以及首次出現的位置。
?
public int firstUniqChar(String s) {//空的就是找不到if(s==null||s.length()==0){return -1;}LinkedHashMap<Character,Node> map = new LinkedHashMap<>();for(int i=0,len=s.length();i<len;i++){Node temp = map.get(s.charAt(i));if(temp==null){map.put(s.charAt(i),new Node(s.charAt(i),i,1));}else {//這兩個引用,指向的是同一個地方,所以直接在這++就好了temp.count++;}}//結果也是按順序的,找到最先出現那個即可Collection<Node> values = map.values();Iterator<Node> iterator = values.iterator();Node result = null;while(iterator.hasNext()){result = iterator.next();if(result.count==1)break;}//如果最后是次數1的就返回,如果最后還沒有次數1的,就是找不到if(result.count==1){return result.index;}else {return -1;}}
?