题目:
字符串中第一个只出现一次的字符。
在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出b。
分析:
最直观的想法是从头开始向后扫描,如果某个字符,在后面没有发现重复的,并且是第一个,那么该字符就是第一个只出现一次的字符,时间复杂度O(n²),不是最佳的解决方案。
创建一个256大小的int数组,统计字符串中每个字符出现的次数,最后根据字符串的顺序查找每个字符出现的次数,查找到第一个次数为1的字符就可以停止了。这样的时间复杂度是O(n)。
解法:
package com.wsy;
public class Main {
public static void main(String[] args) {
int[] times = new int[256 + 1];
char[] chars = "abaccdeff".toCharArray();
int length = chars.length;
for (int i = 0; i < length; i++) {
times[chars[i]]++;
}
for (int i = 0; i < length; i++) {
if (times[chars[i]] == 1) {
System.out.println("第一个只出现一次的字符是:" + chars[i]);
break;
}
}
}
}
题目:
字符流中第一个只出现一次的字符。
请实现一个函数,用来找出字符流中第一个只出现一次的字符。例如,当从字符流中读出前两个字符“go”时,第一个只出现一次的字符是‘g’,当从该字符流中读出前6个字符“google”是,第一个只出现一次的字符是‘l’。
分析:
定义一个256大小的数组,以字符的ascii码作为数组下标,以字符在字符串中的索引作为value,访问array[key]获取value,如果value是-1,表示还没有碰到过这个字符,如果value>=0,表示在字符串的value索引处,已经出现过一次这个值了,那么将value更新为一个负数。当需要统计当前的第一个只出现一次的字符时,遍历这个数组,找value大于0的最小值,便是第一个只出现一次的字符在字符串中的索引。
解法:
package com.wsy;
public class Main {
public static void main(String[] args) {
int[] position = new int[256];
char[] chars = "google".toCharArray();
int count = 6;// 表示当前从流中读取进来的字符数量
for (int i = 0; i < 256; i++) {
position[i] = -1;
}
for (int i = 0; i < count; i++) {
if (position[chars[i]] == -1) {
position[chars[i]] = i;
} else {
position[chars[i]] = -i;
}
}
int minPosition = Integer.MAX_VALUE;
for (int i = 0; i < 256; i++) {
if (position[i] >= 0 && position[i] < minPosition) {
minPosition = position[i];
}
}
System.out.println("第一个只出现一次的字符是:" + chars[minPosition]);
}
}