丑数
1:题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。
示例:
s = "abaccdeff"
返回 "b"
s = ""
返回 " "
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2:题目分析
2.1:暴力搜索
双重循环,外层遍历每一个元素,内层用来判断是不是重复出现的,如果是的则标记,不在进行判断,如果不是的,则直接return。
2.2:HashMap方法
通过将遍历一次所有char置入HashMap中,将重复出现的char置false,只出现一次的置true,然后再遍历一次char,找找依然为true的return即可。
2.3:空间换时间的方法
第一遍遍历:将String内容的个数,通过定义26个char数组,将对应的数加1,第二遍遍历找到第一个依然为1的char输出即可。
3:代码示例
3.1:暴力搜索
package JianZhiOffer50; import java.util.Scanner; /** * @author :dazhu * @date :Created in 2020/4/3 10:33 * @description: * @modified By: * @version: $ */ public class Main { public static void main(String[]args){ Solution solution = new Solution(); System.out.println(solution.firstUniqChar("aaab")); } } class Solution { public char firstUniqChar(String s) { char[] charArray = new char[s.length()]; s.getChars(0,s.length(),charArray,0); int flag = 0; int[] array = new int[s.length()]; for(int i=0;i<s.length();i++){ flag = 0; //只有当灭有重复过的字符,才进行判断。 if(array[i]!=1) { for (int j = i + 1; j < s.length(); j++) { //array不为1,意味着这是一个新的字符,则进行重复判断 if (array[j] != 1) { //如果出现重读,则标记1,同时flag = 1; if (charArray[j] == charArray[i]) { array[j] = 1; array[i] = 1; flag = 1; } } } } //如果当前字符没有重复的,直接return,否则继续判断。 if(flag == 0){ if(array[i] != 1) { return charArray[i]; } } } return ' '; } }
3.2:HashMap
class Solution { public char firstUniqChar(String s) { HashMap<Character, Boolean> dic = new HashMap<>(); char[] sc = s.toCharArray(); for(char c : sc) dic.put(c, !dic.containsKey(c)); for(char c : sc) if(dic.get(c)) return c; return ' '; } }
学习LeetCode大佬 Krahets的方法。
3.3:空间换时间
//这种字符对应数组的技巧,要学会 public char firstUniqChar2(String s) { if (s == null || s.length() == 0) return ' '; int[] map = new int[26]; char[] chars = s.toCharArray(); for (char each : chars) { map[each - 'a']++; } for (char each : chars) { if (map[each - 'a'] == 1) return each; } return ' '; }