丑数

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 ' ';
    }

 

posted @ 2020-04-03 16:29  大朱123  阅读(148)  评论(0编辑  收藏  举报