其他
一道简单的算法面试题
统计指定字符在字符串中出现的次数,包含连续重复的情况,例如要统计字符'a'在'aaa'中出现的次数,那么统计出的结果是3,如果要统计'aa'在'aaa'中出现的次数,那么统计出的结果是2。具体实现思路:
1.首先要确定的是要统计出该结果,肯定是需要对字符串进行遍历的,那么无非就是哪种遍历方式更加高效,时间复杂度更低
2.第一种方案:最直接的方式就是依次顺序遍历
3.第二种方案:好一点的方案就是根据指定字符的长度进行间隔遍历,间隔长度就是指定字符的长度
这里给出两种方案的代码
public class CharCount {
/**
* 依次顺序遍历
*
* @param srcStr
* @param searchStr
*/
private static void strCountWithIterator(String srcStr, String searchStr) {
if (srcStr.length() > 0 && searchStr.length() > 0) {
int searchStrLength = searchStr.length();
int srcStrLength = srcStr.length();
int count = 0;
if (srcStrLength >= searchStrLength) {
int stopIndex = srcStrLength - searchStrLength;
long startTime = System.currentTimeMillis();
//第一种方式,顺序遍历
for (int i = 0; i <= srcStrLength; i++) {
if (i > stopIndex) {
System.out.println("第一种统计方式出现次数为:" + count);
break;
}
if (searchStr.equalsIgnoreCase(srcStr.substring(i, i + searchStrLength))) {
count++;
}
}
long l1 = System.currentTimeMillis() - startTime;
System.out.println("第一种方式耗时:" + l1);
}
}
}
/**
* 间隔遍历
*
* @param srcStr
* @param searchStr
*/
private static void strCountWithIteratorTwo(String srcStr, String searchStr) {
if (srcStr.length() > 0 && searchStr.length() > 0) {
int searchStrLength = searchStr.length();
int srcStrLength = srcStr.length();
if (srcStrLength >= searchStrLength) {
int j = 0;
int count1 = 0;
long startTime1 = System.currentTimeMillis();
while ((j + searchStrLength) <= srcStrLength) {
if (searchStr.equalsIgnoreCase(srcStr.substring(j, j + searchStrLength))) {
count1++;
}
j = j + searchStrLength - 1;
}
System.out.println("第二种统计方式出现的次数:" + count1);
System.out.println("第二种方式耗时:" + String.valueOf(System.currentTimeMillis() - startTime1));
}
}
}
public static void main(String[] args) {
strCountWithIterator("aaaasfasdfwaerwefasfasfwaaafsafdsfasfsdafsfasdfasdfasdfwaerwefsafdsafsdfdsafasfsfasdfasfsdahfkshfgkdsafgkasgdsfsadftwerwesfdsaafafasfsdafasfaaafadfasfasfadfasdfaafafafdsfasa", "aa");
strCountWithIteratorTwo("aaaasfasdfwaerwefasfasfwaaafsafdsfasfsdafsfasdfasdfasdfwaerwefsafdsafsdfdsafasfsfasdfasfsdahfkshfgkdsafgkasgdsfsadftwerwesfdsaafafasfsdafasfaaafadfasfasfadfasdfaafafafdsfasa", "aa");
}
}
//结果值:
第一种统计方式出现次数为:9
第一种方式耗时:1
第二种统计方式出现的次数:9
第二种方式耗时:0
这里自己只想出了这两种方案,如果你有更好的方案,随时交流哦~