通过选择中间元素来创建序列

时间:2018-07-10 04:49:58

标签: java arrays

我是较新的程序员,并且停留在下面,

我想要一个接受输入数组的方法,比方说,

[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o]

并在输出中返回以下顺序, (即找到中间值并添加到数组中)

[h, d, l, b, j, f, n, c, i, e, k, g, m, a, o]

3 个答案:

答案 0 :(得分:0)

假设i / p数组是array1,其中包含{a,b,c......m,n,o}。如果要让输出数组存储中间元素,请创建另一个数组array2并将array1的中间元素存储到array2中,然后从array1中删除中间元素,然后继续以上过程,直到array1为空。

您可以按照以下任一过程从array1中删除元素

array = ArrayUtils.removeElement(array, element) //element is middle element of `array1` in your case

或者您可以使用for循环作为

for (int i = 0; i < array1.length; i++) {
// Delete Function
if (pos == i) { //pos is nothing but middle element
for (int j = i + 1; i < array1.length - 1; j++) {
array1[i] = array[j];
i++;
}
}
}

答案 1 :(得分:0)

所以您想要做的是玩“想想介于1到100之间的数字”的游戏。在计算机科学中,我们将此称为分而治之算法。在本科生综合程度中,这是最重要和最有用的东西之一。

这个游戏的运作方式:

首先选择50。然后,如果目标数字大于50,则选择75。然后,如果目标数字小于75,则选择62(或63)。

这是一个二进制搜索-因为在每个点上都有两个选项(嗯,四个选项确实是-较高/较低/我们发现了它/它不在树中)。

因此,我们可以在大约7个猜测中找到100个目标数字(自然对数(100)),对于N较大的值,这是一个巨大速度改进。

所以您真正想做的是:

[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o]

并将其转换为:

[                     h                     ]
[         d,                      l,        ]
[   b           f           j,          n,  ]
[a,    c,    e,    g,    i,    k,    m,    o]

然后您从“根”(位于图的顶部)下移树

要递归执行此操作-使用类似如下的伪算法:

 array pseudoRearrangeArray(arrayToRearrange) {
      return new array made up of:
          middle number
          +
          pseudoRearrangeArray(everything to the left of middle number)
          +
          pseudoRearrangeArray(everything to the right of middle number)
  }

当然是错误的,因为它会输出[h,d,b,a,c,...

看看您是否能找出原因以及如何解决。

答案 2 :(得分:0)

使用迭代加深方法:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<form>
  <div class="col-lg-10 mb-3">
    <div class="input-group">
      <input type="text" class="form-control rounded-0" id="validationDefaultUsername" placeholder="Username" aria-describedby="inputGroupPrepend2" required>
      <div class="input-group-prepend">
        <input type="submit" vlaue="submit" class="btn btn-primary btn-sm rounded-0" id="inputGroupPrepend2">
      </div>
    </div>
  </div>
</form>

但是它的输出是:

public static void main(String[] args) {
    String[] input = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
        "l", "m", "n", "o"};
    String[] output = resequence(input);
    System.out.println(Arrays.asList(output));
}

private static String[] resequence(String[] input) {
    List<String> output = new ArrayList<>();
    for (int depth = 0; output.size() != input.length; ++depth) {
        iteration(input, 0, input.length, depth, 0, output);
    }
    return output.toArray(new String[output.size()]);
}

private static void iteration(String[] input, int min, int max,
        int target, int depth, List<String> output) {
    if (min < max) {
        int middle = (min+max)/2;
        if (target == depth) {
            output.add(input[middle]);
        } else {
            iteration(input, min, middle, target, depth+1, output);
            iteration(input, middle+1, max, target, depth+1, output);
        }
    }
}

更新

采用广度优先的方法:

[h, d, l, b, f, j, n, a, c, e, g, i, k, m, o]

输出为:

static class Interval {
    private final int min;
    private final int max;

    Interval(int min, int max) {
        this.min = min;
        this.max = max;
    }
}

private static String[] resequence(String[] input) {
    List<String> output = new ArrayList<>();
    if (input.length > 0) {
        List<Interval> queue = new ArrayList<>();
        queue.add(new Interval(0, input.length));
        while (!queue.isEmpty()) {
            Interval ival = queue.remove(0);
            int middle = (ival.min+ival.max)/2;
            output.add(input[middle]);
            if (middle > ival.min) {
                queue.add(new Interval(ival.min, middle));
            }
            if (middle+1 < ival.max) {
                queue.add(new Interval(middle+1, ival.max));
            }
        }
    }
    return output.toArray(new String[output.size()]);
}