在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
7.8
用方法
class Solution {
public char firstUniqChar(String s) {
for (int i = 0; i < s.length(); i++) {
char ch=s.charAt(i);
//首次出现的位置是当前位置,且后面没有再出现这个字符
if(s.indexOf(ch)==i&&s.indexOf(ch,i+1)==-1)
return s.charAt(i);
}
return ' ';
}
}
用int【】
public char firstUniqChar(String s) {
if (s.equals("")) return ' ';
//创建‘a'-'z'的字典
int[] target = new int[26];
//第一次遍历,将字符统计到字典数组
for (int i = 0; i < s.length(); i++) {
target[s.charAt(i) - 'a']++;
}
//第二次遍历,从字典数组获取次数
for (int i = 0; i < s.length(); i++) {
if (target[s.charAt(i) - 'a'] == 1) return s.charAt(i);
}
return ' ';
}
直接
从头开始扫描字符中的每一个字母,那这个字母和后面的每个数比较,时O(n^2)
哈希表HashMap
import java.util.*;
public class Solution {
public int FirstNotRepeatingChar(String str) {
if(str==null||str.length()==0)
return -1;
HashMap<Character,Integer> map=new HashMap<>();
for(int i=0;i<str.length();i++){
if(map.containsKey(str.charAt(i))){
int value = map.get(str.charAt(i));
map.put(str.charAt(i),++value);
}else{
map.put(str.charAt(i),1);
}
}
for(int i=0;i<str.length();i++){
if(map.get(str.charAt(i))==1){
return i;
}
}
return -1;
}
}
类哈希表
//用一个类似hash的东西来存储字符出现的次数,很方便
//其实这个第二步应该也是ka我的地方,没有在第一时间想到只要在遍历一遍数组并访问hash记录就可以了
public class Solution {
public int FirstNotRepeatingChar(String str) {
if(str==null||str.length()==0)
return -1;
int[] count=new int[256];
for(int i=0;i<str.length();i++){
count[str.charAt(i)]++;
}
for(int i=0;i<str.length();i++){
if(count[str.charAt(i)]==1)
return i;
}
return -1;
}
}
每一个数找到对应值O(1),n个数时间复杂度O(n)
总结
1.HashMap用法
HashMap<Character,Integer> map=new HashMap<>();
map.containsKey()
map.put()
map.get()
for(int i=0;i<str.length();i++){
if(map.containsKey(str.charAt(i))){
int value = map.get(str.charAt(i));
map.put(str.charAt(i),++value);
}else{
map.put(str.charAt(i),1);
}
2.类哈希表
使用整数数组替换Map
int [26] 字母a-z
int 【128】ASCII码
int 【256】 扩展ASCII码
3.length和 length()区别
在java中String类可以定义字符串变量和字符串数组,length()用于求String字符串对象的长度,而length用
于求String字符串数组的长度。
length()是求String字符串对象中字符的个数,而length是求字符串数组中有多少个字符串。
添加链接描述