我对这个问题的回答如下,但我想知道我是否可以使用此代码以及复杂性是什么:
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);
}
}
答案 0 :(得分:2)
关于你是否“可以使用此代码”的问题有点含糊不清 - 如果你写了,我认为你可以使用它:)
至于复杂性,O(n)
其中n
是String
中的字符数。要计算出现次数,您必须遍历整个String
,再次迭代它们以查找计数为1
的第一个。在最坏的情况下,您没有非重复字符,或者唯一的非重复字符是最后一个字符。在任何一种情况下,您都必须再次迭代整个String
。所以它是O(n+n) = O(n)
。
修改强>
顺便说一下,你的代码中有一个错误。由于您使用的是插入订单 LinkedHashMap
,因此每次调用put(Character,Integer)
都会导致对基础列表进行重新排序。您应该使用LinkedHashMap<Character,int[]>
代替,并在放置之前检查是否存在密钥。如果它们存在,那么只需增加int[]
中存储的值,以避免通过进行另一次put
调用来重新定位地图。即便如此,结果列表将按照您迭代它的方式的顺序颠倒,因此第一个非重复字符将是您在迭代时找到的最后一个字符,其值为1。 ,你可以在第一个for
循环中反向迭代,如果第一个非重复字符早于原始Entry
中的最后一个字符,你就不必总是遍历整个String
集合。 {1}}。