如何替换直方图中最大矩形的内容

时间:2017-10-24 01:11:55

标签: java

请告诉我,如何用O替换X,直方图中最大的矩形是什么?

这是我生成直方图的代码:

    public static void histogram() {

    double[] data1 = { 4.1, 6.2, 4.5, 8.0, 7.1, 6.2, 6.3, 0.1, 4.5, 5.1 };

    for (int columns = data1.length; columns >= 1; columns--) {
        for (int zeilen = 0; zeilen < data1.length; zeilen++) {
            if (data1[zeilen] >= columns) {
                System.out.print("X");
            } else {
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

public static void main(String[] args) {
    histogram();
}

输出应大致如下:

   X      
   XX     
 X OOOO   
 X OOOO  X
XXXOOOO XX
XXXOOOO XX
XXXOOOO XX
XXXOOOO XX

或者像这样:

   X      
   XX     
 X XXXX   
 X XXXX  X
OOOOOOO XX
OOOOOOO XX
OOOOOOO XX
OOOOOOO XX

最大的领域就在哪里。

2 个答案:

答案 0 :(得分:0)

最简单的方法是先在数组中找到最大值。

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

然后在循环中,检查您使用的数据是否等于最大值,并使用"O"显示。

if (data1[zeilen] == max)
    System.out.println("O");
else
    System.out.println("X");

然后您的最大矩形将为"O"

答案 1 :(得分:0)

一种方法是确定数组中哪个索引值包含最大元素。您可以使用循环或流来执行此操作:

int maxIndex = IntStream.range(0, data1.length)
    .reduce((i1, i2) -> data1[i1] > data1[i2] ? i1 : i2)
    .orElseGet(() -> 0); // If only one element, max must be first

然后在打印出直方图时,您可以根据索引是否匹配来选择要输出的字符。

for (int columns = data1.length; columns >= 1; columns--) {
  for (int zeilen = 0; zeilen < data1.length; zeilen++) {
    if (data1[zeilen] >= columns) {
      System.out.print(zeilen == maxIndex ? 'O' : 'X');
    } else {
      System.out.print(" ");
    }
  }
  System.out.println();
}

我不确定第一个循环中columns的范围(从data1.length1)是一个很好的选择。从(int)data1[maxIndex]1可能会更好。

好的,编辑使它成为一个更有趣的问题。解决这个问题的最简单方法可能是递归细分:

  1. 对于范围[start, end),找到最小值为index的直方图索引。这可以与上面的最大索引值代码类似地计算。

  2. 如果[start, index),请递归重复start < index的步骤1。

  3. 如果[index + 1, end),请递归重复index + 1 < end的步骤1。

  4. 返回步骤1,2和3中具有最大区域的矩形。