leetcode 2351

题目描述

简单题不简单

给你一个由小写英文字母组成的字符串 s ,请你找出并返回第一个出现 两次 的字母。

注意:

如果 a 的 第二次 出现比 b 的 第二次 出现在字符串中的位置更靠前,则认为字母 a 在字母 b 之前出现两次。
s 包含至少一个出现两次的字母。

2351. 第一个出现两次的字母 - 力扣(LeetCode)

解题思路

  1. 最开始想用hashmap解决,因为用的比较熟悉了
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public char repeatedCharacter(String s) {
HashMap map=new HashMap();
for(int i=0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){
return s.charAt(i);
}
map.put(s.charAt(i),1);
}
return s.charAt(0);

}
}
  1. 后来发现,这东西用hashset更合适,因为只需要存key,value没有实际意义
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public char repeatedCharacter(String s) {
HashSet set=new HashSet();
for(int i=0;i<s.length();i++){
if(!set.add(s.charAt(i))){
return s.charAt(i);
}
}
return ' ';
}
}
  1. 看了解析之后,发现可以用位运算,通过int类型的后26位,模拟26个字母,对应某位为1则 &的结果不为0,因此可以找到第一个元素;否则将该元素 | 运算后将对应位置为1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public char repeatedCharacter(String s) {
int letter=0;

for(int i=0;i<s.length();i++){
int l=s.charAt(i)-'a';
if((letter&(1<<l))!=0){
return s.charAt(i);
}
else{
letter=letter|1<<l;
}
}
return ' ';
}
}

leetcode 2351
https://kkkkkong.github.io/posts/36559.html
作者
Kong Weichao
发布于
2023年1月1日
许可协议