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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程宏志 中级黑马   /  2012-7-15 21:37  /  3649 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//已知一个int数组, 编程从数组中获取最大数
class Max
{
        public static void main(String[] args)
        {
                int[]a={11,3,25,10,35,100,400};
                int temp=a[0];
                for(int i=0;i<a.length-1;i++)
                {
                        if(a[i]>a[i+1])
                        {
                                temp=a[i];
                                a[i]=a[i+1];
                                a[i+1]=temp;
                        }
                       
                        else
                        {
                                temp=a[i+1];
                        }
               
                }
   
                System.out.println(temp);
        }
}
如果注释掉else部分时,而数组中的最大数在数组中最后一位,这时按程序验证时,所获取的最大数却不是数组中的最大数,不知是什么原因,求大家给下解释!

10 个回复

倒序浏览
本帖最后由 曹俊 于 2012-7-15 23:07 编辑


楼主:我要是没看错的话,你这段代码,你是将数组的排序与数组的求最值给混淆了!
首先,在第7行:这代代码要是求数组的最值得话,不用将数组的长度-1,也就是不用写成a.length-1。应该需要将整个数组进行遍历。代码应该为for(int i=0;i<a.length;i++);
接下来,我将数组求最值得代码给你写出来,供你参考代码如下:

有问题,请提出哈~~~~~{:soso__8961432591078930798_3:}

1.jpg (32.98 KB, 下载次数: 60)

1.jpg

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
问题很简单仔细看看就能明白,看代码

1.png (9.7 KB, 下载次数: 38)

1.png

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
class Max1
{
         public static void main(String[] args)
        {
                 int[]a={11,3,25,10,35,100,400};
                 int temp=a[0];
                 for(int i=0;i<a.length-1;i++)
                 {
                         if(a>a[i+1])
                         {
                                 temp=a;
//                                 a=a[i+1];
//                                 a[i+1]=temp;楼主只需要把这两行给注释掉就好了

                         }
                        
                        else
                         {
                                 temp=a[i+1];
                         }
               
                }
     
                System.out.println(temp);
         }
}

点评

答非所问  发表于 2012-7-15 22:51
回复 使用道具 举报
  1. //已知一个int数组, 编程从数组中获取最大数
  2. class Max
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int[]a={11,3,25,10,35,100,400};
  7.                /*int temp=a[0];
  8.                 for(int i=0;i<a.length-1;i++)
  9.                 {
  10.                         if(a[i]>a[i+1])
  11.                         {
  12.                                 temp=a[i];
  13.                                 a[i]=a[i+1];
  14.                                 a[i+1]=temp;
  15.                         }
  16.                        
  17.                         else
  18.                         {
  19.                                 temp=a[i+1];
  20.                         }
  21.                
  22.                 }*/
  23.                 int max=getMax(a);//调用getMax()函数,返回值是数组中的最大值
  24.                 System.out.println(max);
  25.         }

  26.     public static int getMax(int[] arr)
  27.     {
  28.         //定义变量记录较大值
  29.         int max=arr[0];
  30.         for (int i=1;i<arr.length ;i++ )
  31.         {
  32.             if(arr[i]>max)
  33.                 max=arr[i];
  34.         }
  35.         return max;
  36.     }
  37. }
复制代码
楼主原先的代码是排序的代码,如果注释掉else部分,返回temp的值可能随着数组的不同而变化(temp的值是最后一次交换时a的值,而不一定是最大值)
楼主可以看一下我帮你写的查找最大值的代码,参考一下~
回复 使用道具 举报
对于length问题,初学者建议写成<=length-1,(角标包含头不包含尾)以后遇到长度的都这么写,好记。楼主确实将排序与取最值混了。
上面的是正解
我提供想法:
1,给定数组。arr{......}
2,将数组中的第一个元素取出来,先假定为最大数存入最大值变量中。max=a[0]
3,遍历给定的数组,每一个元素都和最大值变量比,比最大值大,就把数组中的这个数存入最大值变量中。
for (int x=1;x<=arr.length-1;x++)
{if(max<arr[x])
max=arr[x]}
4,输出最大值。max
回复 使用道具 举报
本帖最后由 101259@qq.com 于 2012-7-15 22:27 编辑

你的逻辑大概是这样的吧(带有一定排序):比较前后两个数a和a[i+1],
          ①如果a大于a[i+1]:把大数a放入temp,并将a和a[i+1]对换,这时a[i+1]是大数了
           ②如果a小于a[i+1]:把大数a[i+1]放入temp中,顺序还是从小到大排列。如果你把else去掉
            那么temp记录的值就是小数a的值,这样自然temp的值可能放的不是最大值了。
这个题只是找数组中的最大数,不需要排序的,只需要找出最大数的下标就可了,然后a[maxIndex]即可。
  1. class Max {
  2.         public static void main(String[] args) {
  3.                 int[] a = { 11, 3, 25, 10, 35, 100, 400 };
  4.                
  5.                
  6.                 int maxIndex=0; //记录最大数的下标,首先把第一个数下标赋给maxIndex
  7.                
  8.                 for (int i = 0; i < a.length - 1; i++) {
  9.                         
  10.                         //将大数的下标放到maxIndex
  11.                      if(a[maxIndex]<a[i+1]){
  12.                              maxIndex=i+1;
  13.                      }
  14.                 }

  15.                 System.out.println(a[maxIndex]);
  16.         }
  17. }
复制代码
回复 使用道具 举报
陆鹏 中级黑马 2012-7-15 22:20:40
8#
本帖最后由 陆鹏 于 2012-7-15 22:22 编辑

首先楼主这种球最大值的方式不是最佳方式,好的方式视频有讲,望楼主认真学习。
这里就题论题了,就分析你错误的情况
int[]a={11,3,25,10,35,100,400};
                int temp=a[0];
                for(int i=0;i<a.length-1;i++)
                {
                        if(a
>a[i+1])
                        {
                                temp=a;
                                a=a[i+1];
                                a[i+1]=temp;
                        }
                        
                     }
第一轮:11,3,25,10,35,100,400
此时temp =11,if(true)------>交换后------>temp=11;
第二轮:3,11,25,10,35,100,400
此时temp = 11,if(false)------->什么都不做------>temp=11;
第三轮:3,11,25,10,35,100,400
此时 temp = 11,if(true)--------->交换------->temp=25;
第四轮:3,11,10,25,35,100,400
此时 temp =25,if(false)---------->什么都不做-----> temp = 25;
此后的数都是前小后大,也就是什么都不做,temp一直保持25不变;

希望楼主以后分析这种循环问题能在草稿纸上如此推算,自己学会分析问题。
浅显之见希望楼主明白。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
陆鹏 发表于 2012-7-15 22:20
首先楼主这种球最大值的方式不是最佳方式,好的方式视频有讲,望楼主认真学习。
这里就题论题了,就分析你 ...

确实,到第四轮后的比较开始出问题,思想不够严谨,谢谢哈! 努力ing。。。
回复 使用道具 举报
苑占丽 发表于 2012-7-15 22:01
class Max1
{
         public static void main(String[] args)

不是要求最大值吗?这个代码就能求啊,怎么就答非所问了?如果  
a=a[i+1];
  a[i+1]=temp;这两句要的话,把数组遍历输出结果就是按顺序输出的。
我只不过把他的代码改成了求最大值的代码,这不正是楼住的需求吗?
所以是楼主把排序和去最值搞混了。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马