一道简单的算法面试题

需求

统计指定字符在字符串中出现的次数,包含连续重复的情况,例如要统计字符’a’在’aaa’中出现的次数,那么统计出的结果是3,如果要统计’aa’在’aaa’中出现的次数,那么统计出的结果是2。具体实现思路:

解决方案

  • 首先要确定的是要统计出该结果,肯定是需要对字符串进行遍历的,那么无非就是哪种遍历方式更加高效,时间复杂度更低
  • 第一种方案:最直接的方式就是依次顺序遍历
  • 第二种方案:好一点的方案就是根据指定字符的长度进行间隔遍历,间隔长度就是指定字符的长度

具体实现

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

这里自己只想出了这两种方案,如果你有更好的方案,随时交流哦~

最后说一句

如果想要学习数仓、Spark、Flink等更多大数据技术,请关注公众号"初学大数据",后期将会同步更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击吧大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值