问答题 如何求指定数字在数组中第一次出现的位置
【正确答案】
【答案解析】问题描述:给定数组a={3,4,5,6,5,6,7,8,9,8},这个数组中相邻元素之差都为1,给定数字9,它在数组中第一次出现的位置的下标为8(数组下标从0开始)。
方法一:“蛮力”法。假设指定数字为t顺序遍历数组中每一个元素,并且将数组中的元素与t进行比较,判断两个值是否相等,若相等,则返回下标位置;若遍历完数组还没找到t,则说明t在数组中不存在,返回-1。该方法的时间复杂度为O(n)。
这种方法显然没有用到题目中“这个数组中相邻元素之差的绝对值为1”这一条件,下面介绍一种更高效的方法。
方法二:跳跃搜索法。通过对数组中元素的特点进行分析发现如下规律:假设先从数组a中查找9出现的位置,首先用数组中第一个元素(数组下标为0)3与9进行比较,它们的差值为6,由于数组中相邻两个元素的差值为1,因此9在数组中出现的最早的位置必定为:第1+6=7个位置(数组下标为6)。这是因为:如果数组是递增的,那么数组第7个元素的值才为9;如果数组不是递增的,那么9出现的位置肯定在数组中第7个元素后面;上面的示例中待查找的数比数组中第一个元素的值大,对于待查找的数比数组中第一个元素小的情况,可以用相同的方法。根据这个特点可以得出算法的思路为:从数组第一个元素开始(i=0),把数组当前位置的值与t进行比较,如果相等,则返回数组下标,否则,从数组下标为i+|t-a[i]|处继续查找。实现代码如下:
public class Test{
public static int findIndex(int a[], int t){
if(a==null)
return;
int len=a.length;
int i=0;
while(i<len){
if(a[i]==t){
return i;
}else{
i+=Math.abs(t-a[i]);
}
}
return -1;
}
public static void main(String[]args){
int a[]={3, 4, 5, 6, 5, 6, 7, 8, 9, 8};
System.out.println(findIndex(a, 9));
}
}
程序运行结果为:
8
显然,采用以上跳跃搜索法减:少了对数组中元素的访问个数,从而提高了算法的效率。