LeetCode 面試題50. 第一個只出現一次的字符

個人LeetCode:https://leetcode-cn.com/u/ituring/

個人LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii

LeetCode 面試題50. 第一個只出現一次的字符

題目

在字符串 s 中找出第一個只出現一次的字符。若是沒有,返回一個單空格。java

示例:
``
s = "abaccdeff"
返回 "b"git

s = ""
返回 " "
``github

限制:面試

  • 0 <= s 的長度 <= 50000

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。算法

解題思路

思路1-直接用JDK的indexOf和lastIndexOf方法

  • indexOf是查首次出現的位置,lastIndexOf是查最後一次出現的位置,若相同就保證了惟一;

算法複雜度:數組

  • 時間複雜度: $ {\color{Magenta}{\Omicron\left(n^{2}\right)}} $
  • 空間複雜度: $ {\color{Magenta}{\Omicron\left(1\right)}} $

思路2-用LinkedHashMap統計;

  • LinkedHashMap保證了記錄順序和統計次數;

算法複雜度:網絡

  • 時間複雜度: $ {\color{Magenta}{\Omicron\left(n\right)}} $
  • 空間複雜度: $ {\color{Magenta}{\Omicron\left(n\right)}} $

思路3-統計字符出現次數

使用256長度的數組,由於不知道題中字符範圍,實際範圍可能須要更大點,可是思路不變;ui

  • 一次遍歷記錄字符出現次數;
  • 再次遍歷找第一個統計到的次數爲1的字符便可;

算法複雜度:code

  • 時間複雜度: $ {\color{Magenta}{\Omicron\left(n\right)}} $
  • 空間複雜度: $ {\color{Magenta}{\Omicron\left(1\right)}} $

算法源碼示例

package leetcode;

import java.util.Iterator;
import java.util.LinkedHashMap;

/**
 * @author ZhouJie
 * @date 2020年5月8日 下午7:54:53 
 * @Description: 面試題50. 第一個只出現一次的字符 
 *
 */
public class LeetCode_Offer_50 {

}

class Solution_Offer_50 {
	/**
	 * @author: ZhouJie
	 * @date: 2020年5月8日 下午7:55:24 
	 * @param: @param s
	 * @param: @return
	 * @return: char
	 * @Description: 1-直接用indexOf和lastIndexOf方法;
	 *
	 */
	public char firstUniqChar_1(String s) {
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (s.indexOf(c) == s.lastIndexOf(c)) {
				return c;
			}
		}
		return ' ';
	}

	/**
	 * @author: ZhouJie
	 * @date: 2020年5月8日 下午8:02:06 
	 * @param: @param s
	 * @param: @return
	 * @return: char
	 * @Description: 2-用LinkedHashMap統計;
	 *
	 */
	public char firstUniqChar_2(String s) {
		LinkedHashMap<Character, Integer> map = new LinkedHashMap<Character, Integer>();
		for (char c : s.toCharArray()) {
			map.put(c, map.getOrDefault(c, 0) + 1);
		}
		Iterator<Character> iterator = map.keySet().iterator();
		while (iterator.hasNext()) {
			Character c = iterator.next();
			if (map.get(c) == 1) {
				return c;
			}
		}
		return ' ';
	}

	/**
	 * @author: ZhouJie
	 * @date: 2020年5月8日 下午8:14:41 
	 * @param: @param s
	 * @param: @return
	 * @return: char
	 * @Description: 3-統計字符出現次數;
	 *
	 */
	public char firstUniqChar_3(String s) {
		int[] all = new int[256];
		char[] cs = s.toCharArray();
		for (char c : cs) {
			all[c]++;
		}
		for (char c : cs) {
			if (all[c] == 1) {
				return c;
			}
		}
		return ' ';
	}

}
相關文章
相關標籤/搜索