好的,我有一个面试编码问题,问题表明在一个循环中我必须找到一个非重复字符的第一个实例.因此,例如,如果字符串是"abcab",它将返回c,因为a和b重复.
我有以下内容遍历整个字符串,并输入发生在哈希映射中的字符数量,它的工作原理.
private static boolean findFirstCharacter(String s) {
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(!map.containsKey(c)){
map.put(c,1);
}else{
int value = map.get(c);
value++;
map.put(c,value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在显然我可以再次迭代并找到键值为1的第一个实例,但它必须是一个循环.无论如何,根据我所拥有或正在接近这个错误,这样做是否仍然存在?
这是在单个循环中执行此操作的一种方法.
该方法可以处理来自辅助平面的Unicode字符,并且已被修改为返回第一个非重复字符,而不是a boolean.
注意:代码需要Java 8+.
private static String findFirstCharacter(String s) {
Set<Integer> singles = new LinkedHashSet<>(), duplicates = new HashSet<>();
s.codePoints().forEach(ch -> {
if (! duplicates.contains(ch) && ! singles.add(ch)) {
singles.remove(ch);
duplicates.add(ch);
}
});
return (singles.isEmpty() ? null : new String(new int[] { singles.iterator().next() }, 0, 1));
}
Run Code Online (Sandbox Code Playgroud)
测试
System.out.println(findFirstCharacter("abcab"));
System.out.println(findFirstCharacter("abcbca"));
System.out.println(findFirstCharacter(""));
Run Code Online (Sandbox Code Playgroud)
产量
c
null
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |