黑马程序员技术交流社区

标题: 新手,弱弱地问个小问题?帮我解答一下。我看了半天没... [打印本页]

作者: 边情2015    时间: 2015-9-25 23:20
标题: 新手,弱弱地问个小问题?帮我解答一下。我看了半天没...
数组内求最大早小的问题:
给定的数组是{-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];
  }

运行结果如下:


作者: orgcheng    时间: 2015-9-25 23:20
  1. public class Main {
  2.         // 求数组最大值
  3.         static int getMax(int[] arr) {
  4.                 int max = 0;
  5.                 for (int x = 1; x < arr.length; x++) {
  6.                         if (arr[max] < arr[x]) {
  7.                                 // 这里出现了错误,应该更换max的值,而不是arr[max]
  8.                                 // 不然你修改了arr数组,下次求最小值就会不正确
  9.                                 // arr[max] = arr[x];
  10.                                 max = x;
  11.                         }
  12.                 }
  13.                 return arr[max];
  14.         }

  15.         // 求数组最小值
  16.         static int getMin(int[] arr) {
  17.                 int min = 0;
  18.                 for (int x = 1; x < arr.length; x++) {
  19.                         if (arr[min] > arr[x]) {
  20.                                 // arr[min] = arr[x];
  21.                                 min = x;
  22.                         }
  23.                 }
  24.                 return arr[min];
  25.         }

  26.         public static void main(String[] args) {
  27.                 int[] arr = { -20, 20, 1, 2, 78 };
  28.                 System.out.println(getMax(arr));
  29.                 // 你求最大值的时候,修改了arr,所以再求最小值时,1就是最小的
  30.                 System.out.println(getMin(arr));
  31.         }
  32. }
复制代码

下次贴代码,可以使用 插入代码这个功能,发表回复上面有的。
作者: 雨中的泪    时间: 2015-9-25 23:26
因为  min 接收的值就是min的初始值。
作者: Jared    时间: 2015-9-25 23:57
你这写的逻辑完全不对,应该是这样的

        // 求最小值的方法
        public static int Min(int[] arr) {
                int min = arr[0];
                for (int i = 0; i < arr.length; i++) {
                        if (arr[i] < min) {
                                min = arr[i];
                        }
                }
                return min;
        }

        // 求最大值的方法
        public static int Max(int[] arr) {

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

你写的arr[max]和arr[min]都是arr[0]没啥意义,最大值对了是凑巧的
作者: 边情2015    时间: 2015-9-25 23:59
Jared 发表于 2015-9-25 23:57
你这写的逻辑完全不对,应该是这样的

        // 求最小值的方法

你说的这个方法我会的, 我就是想用下角标实现。
作者: Jared    时间: 2015-9-26 00:02
正确的做法是将最大/小值初始化为arr[0],然后将数组中的数遍历,遍历过程中和当前的最大/小值比较,如果有较大/小的值出现,就把这个值附给你的最大/小值,然后返回此最值
作者: Jared    时间: 2015-9-26 00:05
边情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];
        }

这样吧
作者: Jared    时间: 2015-9-26 00:08
边情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-9-26 00:12
只能输出1
因为计算机是通过补码运算的,-20的补码要比1的补码大所以由计算机运算最小值是1
作者: 雨中的泪    时间: 2015-9-26 00:14
因为在计算机运算时-20 的补码大于1的补码,所以最小值是1.
作者: 边情2015    时间: 2015-9-26 00:17
雨中的泪 发表于 2015-9-26 00:14
因为在计算机运算时-20 的补码大于1的补码,所以最小值是1.

不是的,只要是把最小值放在第一位就求不出。放在其实位置就可以。求最大值。放在哪个位置都没问题。
作者: 边情2015    时间: 2015-9-26 00:27
Jared 发表于 2015-9-26 00:08
public static int Max(int[] arr) {

                int max = 0;

你确定 if(arr>aar[max])可以这样写?{:2_33:}
作者: 边情2015    时间: 2015-9-26 00:29
放一段运行代结果码吧,如下:
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>

作者: 边情2015    时间: 2015-9-26 00:31
两位辛苦了,先睡觉吧,晚安。如下是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);
               

        }
作者: Jared    时间: 2015-9-26 08:23
边情2015 发表于 2015-9-26 00:27
你确定 if(arr>aar[max])可以这样写?

if(arr>arr[max])字体有问题
作者: orgcheng    时间: 2015-9-26 09:20
挣个技术分不容易啊{:3_63:}
作者: 边情2015    时间: 2015-9-26 10:15
orgcheng 发表于 2015-9-26 09:18
下次贴代码,可以使用 插入代码这个功能,发表回复上面有的。

您说的这个算法,三楼也有说过。这个方法我也有在用。我想换另一种算法来实现。已经调出来了,加个缓存数组就行了。当然程序再进一步优化过后就大家说的这个比较更优了。
作者: 季995    时间: 2015-9-26 15:21
  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");   
复制代码


作者: 孑孓168520    时间: 2015-9-26 20:30
好牛逼{:2_38:}
作者: 雨中的泪    时间: 2015-9-26 22:23
你用简单的if语句判断测试就知道了,同样会输出的是1 所以你的代码是没有问题的,最直接的原因就是计算机在运算的时候使用补码运算的而-20的补码要大于1的,就会输出1的
int a=-20;
int b=1;
if(a>b){
System.out.println(b);
}else {
System.out.println(a);
}
你自己运行一下就会名白还是会判断 1是最小值的

作者: 边情2015    时间: 2015-9-27 22:05
嗯,谢谢。问题已经解决。有三种方法可以解决。你的解决问题的思路不错,错在那里一条条测试就知道是什么原因了。把调用前后数组打印出来看一下就知道了。最简单的方法就是把元素交换变成下标交换就可以了。或者加个数组缓存也是可以的。程序算法没问题。
作者: 迷茫不堪的年纪    时间: 2015-10-10 17:17
不知道你懂没懂, 给你指出点我的感觉,int min = 0 ;  你定义的都是角标,不是元素,总体看起来没什么错, 但是最小值的  if 你选的条件是if(arr[min]>arr[x])这个是没错的!因为我们想要把他放进去和其他角标比,主要在于之后的想要的结果应该是min=arr[x],因为咋们本来就是角标哦。
作者: helloworld2011    时间: 2015-10-17 11:34
雨中的泪 发表于 2015-9-26 00:14
因为在计算机运算时-20 的补码大于1的补码,所以最小值是1.

好牛拜。。。。。。。。。。
作者: helloworld2011    时间: 2015-10-17 11:37

好牛拜,被你的算法吓尿了
作者: helloworld2011    时间: 2015-10-17 11:55
你做了地址传递,会改变数组内的数据。建议做值传递,或者在方法内生成一个新数组接管传来的数组做比较。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2