标签:class bin target static inf ati 跳出循环 循环 存在
我们自己来编写寻找某个数字的方法。
首先是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就可以了。
标签:class bin target static inf ati 跳出循环 循环 存在
原文地址:https://www.cnblogs.com/EvanTheGreat/p/14387783.html