码迷,mamicode.com
首页 > 其他好文 > 详细

FindIndex

时间:2021-02-09 11:58:11      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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就可以了。

技术图片

 

 

FindIndex

标签:class   bin   target   static   inf   ati   跳出循环   循环   存在   

原文地址:https://www.cnblogs.com/EvanTheGreat/p/14387783.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!