算法--微软面试:指定数字在数组中出现的次数

这篇博客介绍了在微软面试中遇到的一道算法题,目标是高效地计算一个数字在给定数组中出现的次数。文章列举了五种不同的解法,包括暴力穷举、遍历开始和结束索引、二分法查找、二分法与for循环结合以及使用二分法查找开始和结束索引。通过比较,强调了第五种方法在大多数情况下计算次数最少,是最佳解决方案。
摘要由CSDN通过智能技术生成

Q题目

在排序数组中,找出给定数字的出现次数,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。

Answer解法

这道题要求出结果不难,但要求最有解的话,就需要花费一番功夫了。常见解法有如下四种:

定义: 要查询的数字为key 查询的数组为arr

1)暴力穷举

直接从头遍历计数就可以了

2)遍历开始和最后一次出现的index

  • 从前开始遍历,遇到与key相同,则停止遍历,得到startIndex

  • 从后开始遍历,遇到与key相同,则停止遍历,得到endIndex

  • 数字出现次数为:endIndex-startIndex

该做法比方法一好一些,减少了一部分计算次数


方法一和方法二代码如下:

package 微软面试题数字次数;

import java.util.Arrays;
import java.util.HashSet;

public class Test1 {
    public static void main(String[] args) {
        int[] arr={
  1,3,7,7,7,7,8,9,9,10};

        System.out.println("方法一测试:不存在key--"+getNumTimes(arr, 11));
        System.out.println("方法一测试:存在一个key--"+getNumTimes(arr, 3));
        System.out.println("方法一测试:存多个key--"+getNumTimes(arr, 9));

        System.out.println();
        System.out.println("方法二测试:不存在key--"+getNumTimes2(arr, 11));
        System.out.println("方法二测试:存在一个key--"+getNumTimes2(arr, 3));
        System.out.println("方法二测试:存多个key--"+getNumTimes2(arr, 9));

    }

    //方法一:暴力解法--完整遍历
    public static int getNumTimes(int[] arr,int key){
        int count=0;

        //超出arr的最大值和最小值就没必要遍历了
        if(key>=arr[0]&&key<=arr[arr.length-1]){
            for (int i : arr) {
                if(i==key){
                    count++;
                }
            }
        }

        return count;
    }

    //方法二:遍历出开头和结尾
    public static int getNumTimes2(int[] arr,int ke
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值