无奈ieq 2020-09-21 22:16 采纳率: 93.8%
浏览 199
已采纳

数组下标越界该怎么修改?

package model;
//价格最低时买入,价格最高时卖出,允许,当天卖出,以便于止损
import java.util.Arrays;
public class Horse {
  public static void main(String[] args) {
    int[] prices = {5, 3, 7, 10, 13, 4};
    profit(prices); //输出
  }
  public static void profit(int[] prices) {
    //不分组,直接算差值
    //后面的减去前面的
    //排序
    int right = prices.length; //总共的天数 
    int num = (right - 1) * right / 2; //总共的可能
    int[] p = new int[num];
    int[] I = new int[num];
    int[] J = new int[num];
    int i = 0, j = right - 1;
    int n = 0;
   for (j = right - 1; j > 0; j--) {
      for (i = 0; i < j; i++) {
        p[n] = prices[j] - prices[i];//利润
        I[n] = i; //买
        J[n] = j;//卖
        n++;
      }
    } 
    //找出最大值
    int newp[] = Arrays.copyOf(p, num);
    Arrays.sort(newp); //排序
    int max = newp[newp.length - 1]; //最大值
    int index = Arrays.binarySearch(p, max); //找到了序号,此处为数组中序号,注意下
    int x = I[index] + 1;
    int y = J[index] + 1;
    System.out.println("第 " + x + " 天买入,第 " + y + " 天卖出,盈利 " + p[index]);
  }
}

这题目是关于商品买卖利润的
报错是数组下标越界,但始终找不到原因,请指正,谢谢。

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-09-21 23:07
    关注

    int index = Arrays.binarySearch(p, max);
    这里index返回了-16
    二分搜索要求p是有序的,你的p并不是,所以没找到

    //价格最低时买入,价格最高时卖出,允许,当天卖出,以便于止损
    import java.util.Arrays;
    public class Horse {
      public static void main(String[] args) {
        int[] prices = {5, 3, 7, 10, 13, 4};
        profit(prices); //输出
      }
      public static void profit(int[] prices) {
        //不分组,直接算差值
        //后面的减去前面的
        //排序
        int right = prices.length; //总共的天数 
        int num = (right - 1) * right / 2; //总共的可能
        int[] p = new int[num];
        int[] I = new int[num];
        int[] J = new int[num];
        int i = 0, j = right - 1;
        int n = 0;
       for (j = right - 1; j > 0; j--) {
          for (i = 0; i < j; i++) {
            p[n] = prices[j] - prices[i];//利润
            I[n] = i; //买
            J[n] = j;//卖
            n++;
          }
        } 
        //找出最大值
        int newp[] = Arrays.copyOf(p, num);
        Arrays.sort(newp); //排序
        int max = newp[newp.length - 1]; //最大值
        int index = 0; 
          for (i = 0; i < p.length; i++)
              if (max == p[i]) index = i;
        int x = I[index] + 1;
        int y = J[index] + 1;
        System.out.println("第 " + x + " 天买入,第 " + y + " 天卖出,盈利 " + p[index]);
      }
    }
    

    第 2 天买入,第 5 天卖出,盈利 10

    问题解决的话,请点下采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊