繁体   English   中英

流中的第一个非重复字符

[英]First non-repeating character in a stream

我对这个问题的回答如下,但是我想知道我是否可以使用此代码以及其复杂性是什么:

import java.util.LinkedHashMap;
import java.util.Map.Entry;

public class FirstNonRepeatingCharacterinAString {

    private char firstNonRepeatingCharacter(String str) {       
        LinkedHashMap<Character, Integer> hash =
                new LinkedHashMap<Character, Integer>();

        for(int i = 0 ; i< str.length() ; i++)
        {
            if(hash.get(str.charAt(i))==null)
                hash.put(str.charAt(i), 1);
            else
                hash.put(str.charAt(i), hash.get(str.charAt(i))+1);
        }

        System.out.println(hash.toString());

        for(Entry<Character, Integer> c : hash.entrySet())
        {
            if(c.getValue() == 1)
                return c.getKey();
        }

        return 0 ;
    }

    public static void main(String args[])
    {
        String str = "geeksforgeeks";
        FirstNonRepeatingCharacterinAString obj =
                new FirstNonRepeatingCharacterinAString();
        char c = obj.firstNonRepeatingCharacter(str);
        System.out.println(c);
    }
}

关于是否“可以使用此代码”的问题有点模棱两可-如果您编写了该代码,我想您可以使用它:)

至于复杂度,它是O(n) ,其中nString的字符数。 要计算出现的次数,您必须遍历整个String ,然后再次遍历它们以找到计数为1的第一个。 在最坏的情况下,您没有非重复字符,或者唯一的非重复字符是最后一个字符。 无论哪种情况,都必须再次遍历整个String 所以它是O(n+n) = O(n)

编辑

顺便说一句,您的代码中有一个错误。 因为您使用的是插入顺序 LinkedHashMap ,所以对put(Character,Integer)每次调用都会导致对基础列表进行重新排序。 您可能应该改用LinkedHashMap<Character,int[]> ,并在放置之前检查是否存在键。 如果它们存在,则只需增加存储在int[]的值即可避免通过进行另一个put调用来重新映射该映射。 即便如此,结果列表也将与您对其进行迭代的方式相反,因此, 第一个非重复字符将是对其进行迭代时发现的最后一个字符,其值为1。或者,您也可以进行反向迭代在您的第一个for循环中,那么如果第一个非重复字符比原始String的最后一个字符早,您就不必总是遍历整个Entry集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM