題目描述: java
在一個字符串(1<=字符串長度<=10000,所有由大寫字母組成)中找到第一個只出現一次的字符。 spa
輸入: 輸入有多組數據
每一組輸入一個字符串。 code
輸出第一個只出現一次的字符下標,沒有隻出現一次的字符則輸出-1 字符串
看到這個題目,最直觀的想法就是就是遍歷法,也就是從頭開始取字符串中的一個字符,將其與其後的全部字符比較,若是有相同的字符,那麼就證實它不是 只出現一次的字符。當第一次出現遍歷完其後字符而且沒有重複時,代表這個字符就是「第一個只出現一次的字符」。若是字符串有n個字符,每一個字符可能與後面 的O(n)個字符相比較,所以這種思路的時間複雜度是O(n2)。 io
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void findOne(String s){ for(int i = 0; i < s.length(); i++){ boolean flag = false; for(int j = 0; j < s.length(); j++){ if(s.charAt(i) == s.charAt(j) && i != j) flag = true; } if(!flag){ System.out.println(1); return; } } System.out.println(-1); } public static void main(String[] args) { // findOne("ABA"); // findOne("AA"); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); while(true){ try { String s = br.readLine(); } catch (IOException e) { e.printStackTrace(); } } } }
題目中要求第一個只出現一次的字符,那麼就跟字符出現的次數有關。咱們考慮如何統計字符出現的次數,而後找出第一個次數爲1的那個字符。這裏咱們須要一個數據容器來保存字符出現次數,而且可以經過字符找出其相對應的次數。哈希表就是一種經常使用用的容器。 class
咱們能夠定義哈希表的鍵值(Key)是字符的ASCII值,而值(Value)是該字符出現的次數。同時咱們須要掃描兩次字符串,第一次掃描字符串 時,每掃描到一個字符就在哈希表的對應項中把次數加1。接下來第二次掃描的時候,沒掃描到一個字符就能在哈希表中獲得該字符出現的次數。找出第一個 Value爲1的那個key就是咱們須要找到那個字符。 import
哈希1: 容器
import java.util.Scanner; public class Copy_2_of_Main { public static void findOne(String s) { int[]a = new int[256]; for (int i = 0; i < s.length(); i++) { int b = s.charAt(i); if(a[b] == 1) a[b] = 2; else a[b] = 1; } for(int j = 0; j < s.length(); j++){ if(a[s.charAt(j)] == 1){ System.out.println(j); return; } } System.out.println(-1); } public static void main(String[] args) { // findOne("AA"); // findOne("ABACCDEFF"); Scanner s = new Scanner(System.in); while (true) { String str = s.next(); findOne(str); } } }哈希2
import java.util.Scanner; public class Main { public static void findOne(String s) { int[] a = new int[26]; int lenght = s.length(); for (int i = 0; i < lenght; i++) { a[s.charAt(i) - 'A']++; } for (int j = 0; j < lenght; j++) { if (a[s.charAt(j) - 'A'] == 1) { System.out.println(j); return; } } System.out.println(-1); } public static void main(String[] args) { // findOne("AA"); // findOne("ABACCDEFF"); Scanner s = new Scanner(System.in); while (s.hasNext()) { String str = s.next(); findOne(str); } } }