标签:map ch return 字符 offer list 50 set Java
一、题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例 1:
输入:s = "abaccdeff"
输出:'b'
示例 2:
输入:s = ""
输出:' '
限制:
0 <= s 的长度 <= 50000
二、思路及Java代码
首先想到的是利用set集合,将字符串中所有字符插入set中,如果一个字符插入set集合失败,则说明他是重复字符,将它记录到list中,然后再遍历字符串,第一个不在list中的字符就是所求。
class Solution {
public char firstUniqChar(String s) {
Set<Character> set = new HashSet<>();
List<Character> list = new ArrayList<>();
for(Character c : s.toCharArray()){
boolean flag = set.add(c);
if(!flag){
list.add(c);
}
}
for(Character c : s.toCharArray()){
if(!list.contains(c)){
return c;
}
}
return ' ';
}
}
上述思想可以直接用map实现,用hashmap记录下每个字符出现的次数,然后遍历字符串的每一个字符,在hash表中值为1的字符即为所求。
class Solution {
public char firstUniqChar(String s) {
Map<Character, Integer> map = new HashMap<>();
for(Character c : s.toCharArray()){
map.put(c, map.getOrDefault(c, 0)+1);
}
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(map.get(ch) == 1){
return ch;
}
}
return ' ';
}
}
由于题目要找的是出现一次的字符,那么我们可以理解为在字符串中是否重复的字符,即可以把哈希表中的键改为布尔类型,提高效率的同时,布尔值可以直接判断,简化了逻辑。
class Solution {
public char firstUniqChar(String s) {
Map<Character, Boolean> map = new HashMap<>();
for(Character c : s.toCharArray()){
map.put(c, map.containsKey(c));
}
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(!map.get(ch)){
return ch;
}
}
return ' ';
}
}
时间复杂度: O(N)
空间复杂度: O(1)
此外,由于题目找的是第一个字符,可以用有序哈希表来实现。因为有序hash表的存储顺序是插入顺序,这样直接返回有序哈希表中的第一个值为false的键即可,更加简便。
标签:map,ch,return,字符,offer,list,50,set,Java 来源: https://blog.csdn.net/m0_49499183/article/details/123064392
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。