File tree Expand file tree Collapse file tree 2 files changed +20
-12
lines changed Expand file tree Collapse file tree 2 files changed +20
-12
lines changed Original file line number Diff line number Diff line change 1
1
# 50. 第一个只出现一次的字符位置
2
2
3
- [ NowCoder] ( https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github )
3
+ ## 题目链接
4
+
5
+ [ 牛客网] ( https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github )
4
6
5
7
## 题目描述
6
8
7
- 在一个字符串中找到第一个只出现一次的字符,并返回它的位置。
9
+ 在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。
8
10
9
11
```
10
12
Input: abacc
@@ -13,11 +15,13 @@ Output: b
13
15
14
16
## 解题思路
15
17
16
- 最直观的解法是使用 HashMap 对出现次数进行统计,但是考虑到要统计的字符范围有限,因此可以使用整型数组代替 HashMap,从而将空间复杂度由 O(N) 降低为 O(1)。
18
+ 最直观的解法是使用 HashMap 对出现次数进行统计:字符做为 key,出现次数作为 value,遍历字符串每次都将 key 对应的 value 加 1。最后再遍历这个 HashMap 就可以找出出现次数为 1 的字符。
19
+
20
+ 考虑到要统计的字符范围有限,也可以使用整型数组代替 HashMap。ASCII 码只有 128 个字符,因此可以使用长度为 128 的整型数组来存储每个字符出现的次数。
17
21
18
22
``` java
19
23
public int FirstNotRepeatingChar(String str) {
20
- int [] cnts = new int [256 ];
24
+ int [] cnts = new int [128 ];
21
25
for (int i = 0 ; i < str. length(); i++ )
22
26
cnts[str. charAt(i)]++ ;
23
27
for (int i = 0 ; i < str. length(); i++ )
@@ -31,8 +35,8 @@ public int FirstNotRepeatingChar(String str) {
31
35
32
36
``` java
33
37
public int FirstNotRepeatingChar2(String str) {
34
- BitSet bs1 = new BitSet (256 );
35
- BitSet bs2 = new BitSet (256 );
38
+ BitSet bs1 = new BitSet (128 );
39
+ BitSet bs2 = new BitSet (128 );
36
40
for (char c : str. toCharArray()) {
37
41
if (! bs1. get(c) && ! bs2. get(c))
38
42
bs1. set(c); // 0 0 -> 0 1
Original file line number Diff line number Diff line change 1
1
# 50. 第一个只出现一次的字符位置
2
2
3
- [ NowCoder] ( https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github )
3
+ ## 题目链接
4
+
5
+ [ 牛客网] ( https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github )
4
6
5
7
## 题目描述
6
8
7
- 在一个字符串中找到第一个只出现一次的字符,并返回它的位置。
9
+ 在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。
8
10
9
11
```
10
12
Input: abacc
@@ -13,11 +15,13 @@ Output: b
13
15
14
16
## 解题思路
15
17
16
- 最直观的解法是使用 HashMap 对出现次数进行统计,但是考虑到要统计的字符范围有限,因此可以使用整型数组代替 HashMap,从而将空间复杂度由 O(N) 降低为 O(1)。
18
+ 最直观的解法是使用 HashMap 对出现次数进行统计:字符做为 key,出现次数作为 value,遍历字符串每次都将 key 对应的 value 加 1。最后再遍历这个 HashMap 就可以找出出现次数为 1 的字符。
19
+
20
+ 考虑到要统计的字符范围有限,也可以使用整型数组代替 HashMap。ASCII 码只有 128 个字符,因此可以使用长度为 128 的整型数组来存储每个字符出现的次数。
17
21
18
22
``` java
19
23
public int FirstNotRepeatingChar(String str) {
20
- int [] cnts = new int [256 ];
24
+ int [] cnts = new int [128 ];
21
25
for (int i = 0 ; i < str. length(); i++ )
22
26
cnts[str. charAt(i)]++ ;
23
27
for (int i = 0 ; i < str. length(); i++ )
@@ -31,8 +35,8 @@ public int FirstNotRepeatingChar(String str) {
31
35
32
36
``` java
33
37
public int FirstNotRepeatingChar2(String str) {
34
- BitSet bs1 = new BitSet (256 );
35
- BitSet bs2 = new BitSet (256 );
38
+ BitSet bs1 = new BitSet (128 );
39
+ BitSet bs2 = new BitSet (128 );
36
40
for (char c : str. toCharArray()) {
37
41
if (! bs1. get(c) && ! bs2. get(c))
38
42
bs1. set(c); // 0 0 -> 0 1
You can’t perform that action at this time.
0 commit comments