第一個只出現一次的字元(java版)
阿新 • • 發佈:2019-01-09
【題目描述】在一個字串(1<=字串長度<=10000,全部由大寫字母組成)中找到第一個只出現一次的字元,並返回它的位置。
【注意】
1.題目中描述字串長度>1, 但是在實際操作中發現,牛客輸入的測試用例中出現了空字串,即長度為0的情況,截止到發文為止,已提交糾錯申請,請注意。
2. 測試用例中出現了小寫字串的測試用例。
3. 若輸入空串,需要返回 -1。題目也未提及到。
【解題思路1】暴力解法
//1. 將字串轉換成字元陣列。
//2. 對陣列進行排序。注意排序後的陣列字元之間的相對位置已經改變。
//3. 遍歷陣列,找出只出現一次的字元。注意處理第一字元和最後一個字元的邊界情況。
//4. 將找到的字元,和未進行排序的字元陣列比較,返回它原來的位置。
import java.util.Arrays;
import java.util.ArrayList;
public class Solution {
public int FirstNotRepeatingChar(String str) {
if(str.length() == 1){
return 0;
}
if(str == null || str.length() == 0){
return -1;
}
int index=0;
char [] chs = str.toCharArray();
char[] chss = str.toCharArray();
ArrayList<Character> arr = new ArrayList<Character>();
Arrays.sort(chs);
for(int i=0, len=chs.length; i<len; i++){
if(i==len-1 && chs[i]!=chs[i-1]){
arr.add(chs[i]);
}else if(i==0 && chs[i]!=chs[i+1]){
arr.add(chs[i]);
}else{
if(i!=0 && i!=len-1 && chs[i]!=chs[i-1] && chs[i]!=chs[i+1]){
arr.add(chs[i]);
}
}
}
for(int j=0, len=chss.length; j<len; j++){
if(arr.contains(chss[j])){
index = j;
break;
}
}
return index;
}
}
【解題思路2】
//1. 利用雜湊表儲存每個字元出現的次數。
//2. 遍歷雜湊表,第一個出現次數為1 的字元即所求。
【原始碼2】
連結:https://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c
來源:牛客網
import java.util.LinkedHashMap;
// use linkedhashmap to keep the order
public class Solution {
public int FirstNotRepeatingChar(String str) {
LinkedHashMap <Character, Integer> map = new LinkedHashMap<Character, Integer>();
for(int i=0;i<str.length();i++){
if(map.containsKey(str.charAt(i))){
int time = map.get(str.charAt(i));
map.put(str.charAt(i), ++time);
}
else {
map.put(str.charAt(i), 1);
}
}
int pos = -1;
int i=0;
for(;i<str.length();i++){
char c = str.charAt(i);
if (map.get(c) == 1) {
return i;
}
}
return pos;
}
}
a. 注意hashmap底層實現是散列表,所以儲存是無序的。而linkedhashmap雖然底層實現也是散列表,但是有一個雙向迴圈列表來維護其插入順序。所以若第二步中遍歷的是map,則使用linkedhashmap。若像上面遍歷是使用原始字串來進行的,則無所謂。