我们自己来编写寻找某个数字的方法。
首先是findNum方法,我们在一个数组中寻找某一个数字,如果存在的话,返回寻找到的第一个该数字的索引,如果没有找到的话,返回-1.
首先,我们肯定要传一个数组和要寻找的数据进去,先声明一个变量res=-1,如果没有找到的话,直接将其返回。其次,我们需要遍历这个数字,在for循环里面,搜寻看是否有数字与之相等,有的话,把该数字的索引赋给res,然后返回res并结束循环。注意这里一定要结束循环!否则最后仍会返回-1!因为-1是要先把整个数组跑遍了都没有找到数据,循环自动结束时才返回的。代码实现如下:
1 package com.hw.ArrayListDemo0131; 2 public class FindIndex { 3 public static void main(String[] args) { 4 int[] data = new int[]{1,2,3,4,8,9,11,16,19,20,28,35,35}; 5 int index = findNum(data,1); 6 System.out.println(index); 7 } 8
9 public static int findNum(int[] array,int data){ 10 int res = -1; 11 for(int i = 0;i < array.length;i++) 12 { 13 if(array[i] == data) 14 { 15 res = i; 16 break; 17 } 18 } 19 return res; 20 } 21 }
接下来,思考一下,是否存在一种更为高效的方法?如果我随便说一个值,让这个值与目标值比较,看是大了还是小了,然后再缩小范围重复这个操作,这样会不会更快?因此,这里写一下二分查找的代码:
1 package com.hw.ArrayListDemo0131; 2 public class FindIndex { 3 public static void main(String[] args) { 4 int[] data = new int[]{1,2,3,4,8,9,11,16,19,20,28,35,35}; 5 int des = binarySearch(data, 9); 6 System.out.println(des); 7 } 8
9 public static int binarySearch(int[] array,int target){ 10 int begin = 0; 11 int end = array.length - 1; 12 while(begin <= end) //如果begin>end就说明没有找到,跳出循环
13 { 14 int indexOfMid = begin + ((end-begin)/2); 15 int mid = array[indexOfMid]; 16 if(target > mid){ //往右推
17 begin = indexOfMid + 1; 18 }else if(target < mid){ //往左推
19 end = indexOfMid - 1; 20 }else{ 21 return indexOfMid; 22 } 23 } 24 return -1; 25 } 26 }
这里,首先这个数组必须是排好序了的。然后,把首元素和最后一个元素拿出来,再取得这个数组中间的元素,并拿这个元素与目标元素进行比较。如果,目标元素大于中间值,那说明目标元素肯定在中间值到尾元素这个区间内,那么首元素和中间值这段区间就不需要考虑了。这个时候,我们需要把区间收缩到中间值的下一个到尾元素的这段区间,那么操作就是begin=indexOfMid+1;如果目标元素小于中间值,那就把尾元素赋值为中间值的上一个元素。如果,目标元素正好就等于中间值,那就是找到了,返回其索引即可。整个这个过程我们肯定要放在循环里面来完成,那么这个时候中间值肯定每次循环时都不一样,因此可以像代码中那样去计算。循环条件怎么设置?我们来想一下,一般来说,begin都是不会大于end的,一旦begin超过了end,那就说明便利了整个数组都没有找到,这个时候返回-1就可以了。
今天的文章FindIndex分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/56420.html