《剑指 Offer 》—50. 第一个只出现一次的字符
创始人
2024-02-17 07:15:17
0

《剑指 Offer 》—50. 第一个只出现一次的字符

一、题目内容

原题连接:https://leetcode.cn/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/description/

题目:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。。

二、个人答案(Java)

在这里插入图片描述

思路:转换为char类型数组然后用两个for循环解决问题

代码

/*
剑指 Offer 50. 第一个只出现一次的字符:
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。*/
package LeetCode;
public class offer50 {public static void main(String[] args) {char abcdefg = firstUniqChar("abaccdeff");System.out.println(abcdefg);}public static char firstUniqChar(String s) {char[] chars = s.toCharArray();for (int i = 0; i boolean flag=true;for (int j = 0; j if (i==j){continue;}if (chars[i]==chars[j]){flag=false;break ;}}if (flag==true){return chars[i];}}return ' ';}
}
/*
class Solution {public char firstUniqChar(String s) {}
}*/

三、官方答案(Java)

方法一:使用哈希表存储频数

思路:我们可以对字符串进行两次遍历。

在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回该字符,否则在遍历结束后返回空格

代码:

class Solution {public char firstUniqChar(String s) {Map frequency = new HashMap();for (int i = 0; i < s.length(); ++i) {char ch = s.charAt(i);frequency.put(ch, frequency.getOrDefault(ch, 0) + 1);}for (int i = 0; i < s.length(); ++i) {if (frequency.get(s.charAt(i)) == 1) {return s.charAt(i);}}return ' ';}
}
方法二:使用哈希表存储索引

思路:

我们可以对方法一进行修改,使得第二次遍历的对象从字符串变为哈希映射。

具体地,对于哈希映射中的每一个键值对,键表示一个字符,值表示它的首次出现的索引(如果该字符只出现一次)或者 −1-1−1(如果该字符出现多次)。当我们第一次遍历字符串时,设当前遍历到的字符为 ccc,如果 ccc 不在哈希映射中,我们就将 ccc 与它的索引作为一个键值对加入哈希映射中,否则我们将 ccc 在哈希映射中对应的值修改为 −1-1−1。

在第一次遍历结束后,我们只需要再遍历一次哈希映射中的所有值,找出其中不为 −1-1−1 的最小值,即为第一个不重复字符的索引,然后返回该索引对应的字符。如果哈希映射中的所有值均为 −1-1−1,我们就返回空格。

代码

class Solution {public char firstUniqChar(String s) {Map position = new HashMap();int n = s.length();for (int i = 0; i < n; ++i) {char ch = s.charAt(i);if (position.containsKey(ch)) {position.put(ch, -1);} else {position.put(ch, i);}}int first = n;for (Map.Entry entry : position.entrySet()) {int pos = entry.getValue();if (pos != -1 && pos < first) {first = pos;}}return first == n ? ' ' : s.charAt(first);}
}
方法三:队列

思路:

在这里插入图片描述

代码

class Solution {public char firstUniqChar(String s) {Map position = new HashMap();Queue queue = new LinkedList();int n = s.length();for (int i = 0; i < n; ++i) {char ch = s.charAt(i);if (!position.containsKey(ch)) {position.put(ch, i);queue.offer(new Pair(ch, i));} else {position.put(ch, -1);while (!queue.isEmpty() && position.get(queue.peek().ch) == -1) {queue.poll();}}}return queue.isEmpty() ? ' ' : queue.poll().ch;}class Pair {char ch;int pos;Pair(char ch, int pos) {this.ch = ch;this.pos = pos;}}
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...