![](/img/trans.png)
[英]How to write JUnit test case for finding first non-repeating character in stream?
[英]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)
,其中n
是String
的字符数。 要计算出现的次数,您必须遍历整个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.