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