我是较新的程序员,并且停留在下面,
我想要一个接受输入数组的方法,比方说,
[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]
答案 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()]);
}