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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
数组内求最大早小的问题:
给定的数组是{-20,20,1,2,78},调用以下两个函数算,算出来最大值是对的,而最小值显示的是1。这是为什么呢?看了半天没看出来。跪谢了!。
static int getMax(int [] arr)
{
  int max = 0 ;
  for (int x=1;x<arr.length ;x++ )
  {
   if(arr[max]<arr[x])
    arr[max] = arr[x];
  }
  return arr[max];
}
//求数组最小值
static int getMin(int [] arr)
  {
   int min = 0 ;
   for (int x=1;x<arr.length ;x++ )
   {
    if(arr[min]>arr[x])
     arr[min]=arr[x];
   }
   return arr[min];
  }

运行结果如下:

24 个回复

正序浏览
你做了地址传递,会改变数组内的数据。建议做值传递,或者在方法内生成一个新数组接管传来的数组做比较。
回复 使用道具 举报

好牛拜,被你的算法吓尿了
回复 使用道具 举报
雨中的泪 发表于 2015-9-26 00:14
因为在计算机运算时-20 的补码大于1的补码,所以最小值是1.

好牛拜。。。。。。。。。。
回复 使用道具 举报
不知道你懂没懂, 给你指出点我的感觉,int min = 0 ;  你定义的都是角标,不是元素,总体看起来没什么错, 但是最小值的  if 你选的条件是if(arr[min]>arr[x])这个是没错的!因为我们想要把他放进去和其他角标比,主要在于之后的想要的结果应该是min=arr[x],因为咋们本来就是角标哦。
回复 使用道具 举报
嗯,谢谢。问题已经解决。有三种方法可以解决。你的解决问题的思路不错,错在那里一条条测试就知道是什么原因了。把调用前后数组打印出来看一下就知道了。最简单的方法就是把元素交换变成下标交换就可以了。或者加个数组缓存也是可以的。程序算法没问题。
回复 使用道具 举报
你用简单的if语句判断测试就知道了,同样会输出的是1 所以你的代码是没有问题的,最直接的原因就是计算机在运算的时候使用补码运算的而-20的补码要大于1的,就会输出1的
int a=-20;
int b=1;
if(a>b){
System.out.println(b);
}else {
System.out.println(a);
}
你自己运行一下就会名白还是会判断 1是最小值的
回复 使用道具 举报
好牛逼{:2_38:}
回复 使用道具 举报
  1. 单独运行求最小值的方法时,可以得出-20.
  2. int[] arr={-20,20,1,2,78};
  3.         Arrays.sort(arr);//数组按数字升序进行排序
  4.                 System.out.println("最小数:"+arr[0]);
  5.                 System.out.println("最大数:"+arr[arr.length-1]+"\n");   
复制代码

回复 使用道具 举报
orgcheng 发表于 2015-9-26 09:18
下次贴代码,可以使用 插入代码这个功能,发表回复上面有的。

您说的这个算法,三楼也有说过。这个方法我也有在用。我想换另一种算法来实现。已经调出来了,加个缓存数组就行了。当然程序再进一步优化过后就大家说的这个比较更优了。
回复 使用道具 举报
挣个技术分不容易啊{:3_63:}
回复 使用道具 举报
Jared 中级黑马 2015-9-26 08:23:18
14#
边情2015 发表于 2015-9-26 00:27
你确定 if(arr>aar[max])可以这样写?

if(arr>arr[max])字体有问题
回复 使用道具 举报
两位辛苦了,先睡觉吧,晚安。如下是main函数调用代码:
public static void main(String[] args)
        {
                int [] arr={-20,20,1,2,78};
                int max = ArrayTools.getMax(arr);
                System.out.println("max="+max);
                int min = ArrayTools.getMin(arr);
                System.out.println("min="+min);
               

        }
回复 使用道具 举报
放一段运行代结果码吧,如下:
D:\java\Day06\925>
D:\java\Day06\925>
D:\java\Day06\925>
D:\java\Day06\925>javac StaticTest.java

D:\java\Day06\925>java StaticTest
max=78
min=1

D:\java\Day06\925>
回复 使用道具 举报
Jared 发表于 2015-9-26 00:08
public static int Max(int[] arr) {

                int max = 0;

你确定 if(arr>aar[max])可以这样写?{:2_33:}
回复 使用道具 举报
雨中的泪 发表于 2015-9-26 00:14
因为在计算机运算时-20 的补码大于1的补码,所以最小值是1.

不是的,只要是把最小值放在第一位就求不出。放在其实位置就可以。求最大值。放在哪个位置都没问题。
回复 使用道具 举报
因为在计算机运算时-20 的补码大于1的补码,所以最小值是1.
回复 使用道具 举报
只能输出1
因为计算机是通过补码运算的,-20的补码要比1的补码大所以由计算机运算最小值是1
回复 使用道具 举报
Jared 中级黑马 2015-9-26 00:08:02
7#
边情2015 发表于 2015-9-25 23:59
你说的这个方法我会的, 我就是想用下角标实现。

    public static int Max(int[] arr) {

                int max = 0;
                for (int i = 0; i < arr.length; i++) {
                        if (arr > arr[max]) {
                                max = i;
                        }
                }
                return arr[max];
        }
这样,下标的话一样,就是返回值注意这么写
回复 使用道具 举报
边情2015 发表于 2015-9-25 23:59
你说的这个方法我会的, 我就是想用下角标实现。

    public static int Max(int[] arr) {

                int max = 0;
                for (int i = 1; i < arr.length; i++) {
                        if (arr > arr[max]) {
                                max = i;
                        }
                }
                return arr[max];
        }

这样吧
回复 使用道具 举报
正确的做法是将最大/小值初始化为arr[0],然后将数组中的数遍历,遍历过程中和当前的最大/小值比较,如果有较大/小的值出现,就把这个值附给你的最大/小值,然后返回此最值
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马