A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陆强强 于 2012-4-25 14:16 编辑

public static int getSearch(int[] arr,int key)
        {
                for (int min = 0,max = arr.length-1,mid = (min+max)/2;min<=max ;mid = (min+max)/2)
                {
                        if (key<arr[mid])
                                max=mid-1;
                        else if (key>arr[mid])
                                min=mid+1;
                        else
                                return mid;
                }
                        return min;//不能返回min或max?

12 个回复

倒序浏览
你整个循环 就一个return -1 语句,当进入到相应的条件后,应该有相应的 return值!
回复 使用道具 举报
你的MIN,MAX定义在for语句里面,而return在外边,没发获取。
回复 使用道具 举报
首先你先明确函数返回的是什么、  返回的是你查找的结果。而不是什么最大值最小值
min 和max只是循环里的条件而已、mid才是你需要查找的数。
回复 使用道具 举报
变量有自己的作用域。对于for来讲:如果将用于控制循环的增量定义在for语句中,那么该变量只在for 语句内有效。for语句执行完毕。该变量在内存中被释放。所以不能返回。
回复 使用道具 举报
public static int getSearch(int[] arr,int key)
        {
                for (int min = 0,max = arr.length-1,mid = (min+max)/2;min<=max ;mid = (min+max)/2)
                {
                        if (key<arr[mid])
                                max=mid-1;
                        else if (key>arr[mid])
                                min=mid+1;
                        else
                                return mid;
                }
                        return -1;//不能返回min,max?

你把min,max定义在了for循环中,循环结束后,min,max就消失了,不在内存中了,所以没法返回
回复 使用道具 举报
马东华 发表于 2012-4-24 17:27
public static int getSearch(int[] arr,int key)
        {
                for (int min = 0,max = arr. ...

public static int getmin(int[]arr)
        {
                int min = arr[0];
                for(int x=1;x<arr.length;x++)
                {
                        if(arr[x]<min)
                                min=arr[x];
                }
                return min;//这里为什么可以
回复 使用道具 举报
周海诚 黑马帝 2012-4-24 17:35:37
8#
你把min max的值定义在了for循环内,就是局部变量只在for循环的{}内有效 所以不能返回min max的值因为获取不到。正确的代码如下
class Sort
{
        public static void main(String[] args)
        {
                int[] arr = {2,4,5,7,8,19,32,45};
                int x = halfSearch(arr,9);
                System.out.println(x);
        }
        public static int halfSearch(int[] arr,int key)
        {
                int min,max,mid;
                min = 0;
                max = arr.length-1;
                while (min<=max)
                {
                        mid = (min+max)/2;
                        if (key>arr[mid])
                        {
                                min = mid+1;
                        }
                        else if (key<arr[mid])
                        {
                                max = mid-1;
                        }
                        else
                                return mid;
                }
                return min;
        }
回复 使用道具 举报
杨威 中级黑马 2012-4-24 17:44:35
9#
一个程序返回什么视你的需求而定啊,当你需要返回min,max时,就返回对应的值呗。
对于你这个折半查找程序,如果是想利用它插入一个值时,这时就可返回min(在变量作用范围正确的情况),这是视需求而定的。
回复 使用道具 举报
完全可以,这么打代码就行
public static int getSearch(int[] arr,int key)
     {       
                         int min , max,mid;
             for ( min = 0,max = arr.length-1,mid = (min+max)/2;min<=max ;mid = (min+max)/2)
             {
                     if (key<arr[mid])
                             max=mid-1;
                     else if (key>arr[mid])
                             min=mid+1;
                     else
                             return mid;
             }
              return min;

     }
回复 使用道具 举报
陆强强 发表于 2012-4-24 17:34
public static int getmin(int[]arr)
        {
                int min = arr[0];

你这里是要返回一个最小值啊,而且变量min的作用范围够广
回复 使用道具 举报
陆强强 发表于 2012-4-24 17:34
public static int getmin(int[]arr)
        {
                int min = arr[0];

变量有自己的作用域,对于刚才的程序,你是直接的定义到for循环中的,所以它的作用域是for循环内部,循环结束,也就随着消失,而而对于这个程序你是将变量定义在了getMin方法域中了,所以他的作用域也就是整个方法域中,所以for循环结束了,它依然存在啊,可以返回啊
回复 使用道具 举报
1楼是因为min,max设置在for循环内当循环结束后min,mid自动释放了所以最后不能return min或return max。设置在循环内的变量只在循环内有效。
至于在7楼的问题是因为变量设置在函数内,对整个函数都有效。
如果是像查询一个数在某个排序数组中的位置应当:
public static int getSearch(int[] arr,int key)
        {
                for( int min = 0,max = arr.length-1,mid = (min+max)/2;min<=max ;mid = (min+max)/2)
                {
                        if (key<arr[mid])
                                max=mid-1;
                        else if (key>arr[mid])
                                min=mid+1;
                        else
                                return mid;
                }
                        return -1;//当循环结束后,for循环中没有满足的条件,也就是arr[]中没有key,通常return-1;


如果要是想通过一个排序数组的位置,如果数组不存在则返回应当插入的位置:
public static int getSearch(int[] arr,int key)
        {
            int min = 0,max = arr.length-1,mid = (min+max)/2;
              while(min<=max)
                {
                        if (key<arr[mid])
                                max=mid-1;
                        else if (key>arr[mid])
                                min=mid+1;
                        else
                                return mid;
                }
                        return min;//当循环结束后,for循环中没有满足的条件,key在此数组中应当插入的角标位置;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马