剑指offer_【34】第一个只出现一次的字符位置

1.题目描述

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

2.解题思路

1.用两个list,一个list用来存放只出现一次的字符,一个用来存放出现多次的字符

2.依次遍历str里面的字符,如果list1和list2里面都没有,则说明这个字符是第一次出现,将其添加到list1,否则说明之前出现过该字符,将其移除list1并添加到list2里面

3.最后判断list里面是否有值,有则返回list里面的第一个值在str出现的第一次的位置,即为第一次出现的字符位置。

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static int FirstNotRepeatingChar(String str) {
if (str.length() == 0 || str == null)
return -1;
//list1存放str中出现1次的字符
ArrayList<Character> list1 = new ArrayList<Character>();
//list2用来存放多次出现的字符
ArrayList<Character> list2 = new ArrayList<Character>();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
//两个list里面都没有这个字符
if (!list1.contains(ch) && !list2.contains(ch)) {
//将字符放到list1中
list1.add(Character.valueOf(ch));
} else {
//将list1之前加入的删掉(此时出现了相同字符,删掉相同字符)
list1.remove(Character.valueOf(ch));
//将str中含有的相同字符存入list2
list2.add(Character.valueOf(ch));
}
}
if (list1.size() < 0) {
return -1;
}
return str.indexOf(list1.get(0));

}
文章目录
  1. 1. 1.题目描述
  2. 2. 2.解题思路
  3. 3. 3.代码
| 139.6k