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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*
作者:
时间:2012年4月7日
功能,查找一个数在一个数组里的脚标
*/
class  demo4
{
        public static void main(String[] args)
        {
                int[] arr={2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19};
                int index=findindexArr(arr,8);//调用函数,并将返回的脚标装起来
                System.out.println("index="+index);//打印返回的脚标
        }
        public static int findindexArr(int [] x,int y)
        {
                int min=0,max=x.length-1,mid;
                while(min<=max)
                {
                            mid=(max+min)/2;
                                if (y>x[mid])
                                        mid=mid+1;
                                else if(y<x[mid])
                                        mid=mid-1;
                                else
                                        return mid;
                }
                return -1;
        }
}

我定义的数组里没有8,返回值应该是-1的啊,怎么不是呢?好奇怪?哪里出了问题?

11 个回复

倒序浏览
本帖最后由 lyqinyan 于 2012-4-7 21:37 编辑

  1. public static void main(String[] args) {
  2.                                 int[] arr={2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19};
  3.                                 int index=findindexArr(arr,8);//调用函数,并将返回的脚标装起来
  4.                                 System.out.println("index="+index);//打印返回的脚标
  5.                         }
  6.                         public static int findindexArr(int [] x,int y)
  7.                         {
  8.                                 int min=0,max=x.length-1,mid;
  9.                                 while(min<=max)
  10.                                 {
  11.                                             mid=(max+min)/2;
  12.                                                 if (y>x[mid])
  13.                                                         mid=mid+1;  // 应该这样写    min = mid + 1;
  14.                                                 else if(y<x[mid])   
  15.                                                         mid=mid-1;   // 应该这样写    max = mid + 1;
  16.                                                 else
  17.                                                         return mid;
  18.                                 }
  19.                                 return -1;

  20.        
  21.         }
复制代码
if 语句内的错误,我已经标注出来了~~  
回复 使用道具 举报

哥地方

本帖最后由 宋蕈 于 2012-4-7 21:39 编辑

class  demo4
{
        public static void main(String[] args)
        {
                int[] arr={2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19};
                int index=findindexArr(arr,8);
                System.out.println("index="+index);
        }
        public static int findindexArr(int [] x,int y)
        {
                int min=0,max=x.length-1,mid;
                while(min<=max)      
                {
                            mid=(max+min)/2;
                                if (y>x[mid])
                                        mid=mid+1;   //  这个地方,你就算把mid设置为了加一,等它
                                                                                                        // 程序执行后一样循环到 mid=(max+min)/2 ,总的来说,程序就一直死循环着,
                                else if(y<x[mid])
                                        mid=mid-1;   //  这个地方也是一样
                                else
                                        return mid;
                }
                return -1;
        }

解决方法:
                  public static int findindexArr(int [] x,int y)
        {
                int min=0,max=x.length-1,mid;
                while(min<=max)      
                {
                            mid=(max+min)/2;
                                if (y>x[mid])
                                        min=mid+1;   // 该为这个
                                                                            
                                else if(y<x[mid])
                                        max=mid-1;   // 该为这个
                                else
                                        return mid;
                }
                return -1;
        }

最后结果就能运行了。
回复 使用道具 举报
本帖最后由 lyqinyan 于 2012-4-7 21:44 编辑
宋蕈 发表于 2012-4-7 21:35
class  demo4
{
        public static void main(String[] args)


你回答错了。。晕~~~~


min=x[mid]+1;  这里  不可以写这样。。   这是数组的角标加1  ,不是数组角标对应的数字加1~~~   正确的是: min = mid + 1;
回复 使用道具 举报
很简单啊,你while里面的执行语句设置错误,你的min和max从来没变过,进而导致程序死循环:
while的具体代码如下:
while(min<=max)
                {   
                    mid=(min+max)/2 ;
                        if (y>x[mid])
                          min=mid+1;
                      else if(y<x[mid])
                          max=mid-1;
                      else
                          return mid;
                }
回复 使用道具 举报
楼上说的对,你那代码应该是打错了吧
回复 使用道具 举报
楼主以后编程一定要注意循环体的判断条件了
回复 使用道具 举报
楼主以后编程一定要注意循环体的判断条件了

5.JPG (41.03 KB, 下载次数: 52)

5.JPG
回复 使用道具 举报
  注意循环体的判断条件

public static int findindexArr(int [] x,int y)
        {
                int min=0,max=x.length-1,mid;
                while(min<=max)
                {
                            mid=(max+min)/2;
                                if (y>x[mid])
                                        mid=mid+1;       //改为min = mid + 1
                                else if(y<x[mid])
                                        mid=mid-1;        // 改为max = mid - 1
                                else
                                        return mid;
                }
                return -1;
        }
回复 使用道具 举报
谢谢啊!我知道了!怎么没有看到这里呢,哈哈!
回复 使用道具 举报
本帖最后由 欧阳才志 于 2012-4-8 12:39 编辑

/*
作者:
时间:2012年4月7日
功能,寻找一个数在一个有序数组里的位置,并打印出脚标,如果找不到,返回-1
*/
class  demo4
{
        public static void main(String[] args)
        {
                int[] arr={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
                int index=insertArr(arr,8);
                System.out.println("index="+index);
        }
        public static int insertArr(int [] x,int y)
        {
                int min=0,max=x.length-1,mid;
                while(min<=max)
                {
                            mid=(max+min)/2;//将数组的脚标分成两半,中间的那个脚标先标记起来
                                if (y>x[mid]) //所给值大于这个有序数组的中间值,那么我就应该在这个有序数组的后边找,
                                        {min=mid+1;}//脚标最小值移到中间值后边第一位
                                else if(y<x[mid])
                                        {max=mid-1;}//小于数组中的中间值时,应该往前找,将脚标最大值移到中间值前一位
                                else
                                        return mid;// 中奖,我给的值正好就是中间这个
                }
                return -1;
        }
}
修改了一下,呵呵,结果正确。哎!怎么会没有发现问题在这里呢?晕菜!谢谢各位了!
回复 使用道具 举报
pray 高级黑马 2014-4-26 04:38:08
12#
我也来顶一下..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马