美文网首页
面试题50_1:第一个只出现一次的字符

面试题50_1:第一个只出现一次的字符

作者: 繁星追逐 | 来源:发表于2019-11-12 14:23 被阅读0次

题目描述

  • 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

思路:使用数组代替map统计每个位置字符出现的次数,最后循环找出第一个是1的。
代码如下:

/**
     * 返回索引,一个字符8个字节,所有字符一共有256种情况
     * @param str
     * @return
     */
    public int FirstNotRepeatingChar(String str) {
        if (str.isEmpty() || str.length() == 0) return -1;
        int[] map = new int[256];
        for (int i=0;i<str.length();i++){
            map[str.charAt(i)] += 1;
        }
        for (int j=0;j<str.length();j++){
            if (map[str.charAt(j)] == 1){
                return j;
            }
        }
        return -1;
    }

    /**
     * 返回第一个不重复字符
     */
    public char firstNotRepeatingChar(String str) {
        if (str == null || str.length() == 0) return '\0';
        int[] count = new int[256];

        for (int i = 0; i < str.length(); i++) {
            count[str.charAt(i)]++;
        }
        for (int i = 0; i < str.length(); i++) {
            if (count[str.charAt(i)] == 1) return str.charAt(i);
        }
        return '\0';
    }

扩展题

/**
     * 从第一个字符串中删除第二个字符串中出现过的所有字符
     */
    public String deleteFromAnother(String str, String another) {
        if (another == null || another.length() == 0){
            return str;
        }
//        int[] map = new int[256];
        boolean[] map = new boolean[256];
        StringBuilder sb = new StringBuilder();
        for (int i=0;i<another.length();i++){
//            map[another.charAt(i)]++;
            map[another.charAt(i)] = true;
        }
        for (int j=0;j<str.length();j++){
//            if (map[str.charAt(j)] == 0){
//                sb.append(str.charAt(j));
//            }
            if (!map[str.charAt(j)]){
                sb.append(str.charAt(j));
            }
        }
        return sb.toString();
    }
    /**
     * 删除字符串中所有的重复字符
     */
    public String deleteRepeating(String str) {
        if (str.length() == 0 || str == null) return str;
        boolean[] map = new boolean[256];
        StringBuilder sb = new StringBuilder();
        for (int i=0;i<str.length();i++){
            if (!map[str.charAt(i)]){
                sb.append(str.charAt(i));
            }
            map[str.charAt(i)] = true;
        }
        return sb.toString();
    }

    /**
     * 变位词
     */
    public boolean hasSameChar(String s1, String s2) {
        if (s1 == null || s2 == null) return false;
//        int len1 = s1.length();
//        int len2 = s2.length();
//        if (len1 != len1) return false;
//        boolean[] map = new boolean[256];
//        for (int i=0;i<len1;i++){
//            map[s1.charAt(i)] = true;
//        }
//        for (int j=0;j<len2;j++){
//            if (!map[s2.charAt(j)]){
//                return false;
//            }
//        }
//        return true;
        /*
        计数
         */
        int[] count = new int[256];
        // 统计第一个字符串
        for (int i = 0; i < s1.length(); i++) {
            count[s1.charAt(i)]++;
        }
        // 第二个字符串中如果有该字符,就减去
        for (int i = 0; i < s2.length(); i++) {
            count[s2.charAt(i)]--;
        }
        // 如果是变位词,最后count数组每个位置都是0
        for (int i = 0; i < 256; i++) {
            if (count[i] != 0) return false;
        }
        return true;
    }

总结:如果对于字符出现过或者统计次数的情况,可以构造一个简单的数组去模拟哈希表。

相关文章

网友评论

      本文标题:面试题50_1:第一个只出现一次的字符

      本文链接:https://www.haomeiwen.com/subject/zobeuctx.html