好的,我有一个带有一些值的随机数组:
Integer[] array = {null,null,5,111,21,null,22,null,null,null,98,25,47,null,1,23,null}
我想用最接近的两个现有数组值的平均值替换所有null
值。
例如:前两个null
值需要替换为数字5
({null,null,5,...
变为{5,5,5,...
)。
下一个示例:{...,22,null,null,null,98,...}
应该变为:{...,22,60,60,60,98,...}
;所有三个null
值都将替换为22
和98
((22+98)/2
)的平均值。
最后一个示例:{...,23,null}
应该成为{...,23,23}
; null
替换为23
,因为它是数组的最后一个元素。
有没有人知道如何为这个问题编写算法?
答案 0 :(得分:3)
假设这是在ArrayList<Integer>
上完成的:
//iterate over all values
for (int i=0; i<array.size(); i++) {
//get the value at the current position
Integer value= array.get(i);
//if the value is null...
if (value == null) {
//find out the closes left and right values
Integer leftValue= goLeft(array, i);
Integer rightValue= goRight(array, i);
//if both are integer values, find middle
if (leftValue != null && rightValue != null) {
array.add(i, (leftValue + rightValue)/2);
//if left one is integer, and the other one is null? end of the array
} else if (leftValue != null && rightValue == null) {
array.add(i, leftValue);
//if the right one is integer, and the left one is null? begin of the array
} else if (leftValue == null && rightValue != null) {
array.add(i, rightValue);
//well, if everything is null, just add zeros
} else {
array.add(i, 0);
}
}
}
剩下的就是实施
goLeft(ArrayList<Integer> array, int index)
和goRight(ArrayList<Integer> array, int index)
。 我认为他们在上下文中非常直接,只是看看他们的名字。
答案 1 :(得分:0)
答案 2 :(得分:0)
这是我的看法:
public static void fill(Integer[] newarr, Integer[] arr, int index) {
if (arr[index] != null) {
newarr[index] = arr[index];
return;
}
Integer a = null, b = null;
int i = index;
while (i < arr.length - 1 && (a = arr[++i]) == null);
i = index;
while (i > 1 && (b = arr[--i]) == null);
newarr[index] = (a == null) ? b : (b == null) ? a : (a + b) / 2;
}
然后:
Integer[] arr = { null, null, 5, 111, 21, null, 22, null, null, null,
98, 25, 47, null, 1, 23, null };
Integer[] newarr = new Integer[arr.length];
for (int i = 0; i < arr.length; i++)
fill(newarr, arr, i);
System.out.println(Arrays.toString(newarr));
[5, 5, 5, 111, 21, 21, 22, 60, 60, 60, 98, 25, 47, 24, 1, 23, 23]
答案 3 :(得分:-1)
一种可能的,更简单但可能效率更低的解决方案:
它是如何运作的?
{null,null,5,111,21,null,22,null,null,null,98,25,47,null,1,23,null}
{null,5 ,5,111,21,21, 22, 22,null,98 ,98,25,47,24 ,1,23,23 }
{5 ,5 ,5,111,21,21, 22, 22,60 ,98 ,98,25,47,24 ,1,23,23 }
这些值的平均值相同,算法更简单。
<强>优点强>
<强>缺点强>