将数组中的空值转换为现有值的平均值

时间:2013-06-12 14:04:17

标签: java arrays algorithm null

好的,我有一个带有一些值的随机数组:

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值都将替换为2298(22+98)/2)的平均值。

最后一个示例:{...,23,null}应该成为{...,23,23}; null替换为23,因为它是数组的最后一个元素。

有没有人知道如何为这个问题编写算法?

4 个答案:

答案 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)

  1. 确定所有null序列(存储开始和结束索引 每个序列)
  2. 确定每个的边框元素 序列和caclculate平均值(一定要处理额外的情况 正确地开始和结束数组)
  3. 用。替换null 计算值

答案 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)

一种可能的,更简单但可能效率更低的解决方案:

  1. 为每个空检查左右值 一个。如果他们都是数字,取平均值 湾如果一个为null且一个是数字,则将中间值设置为值,将另一个保留为空
  2. 重复,直到没有空值
  3. 它是如何运作的?

    {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  }
    

    这些值的平均值相同,算法更简单。

    <强>优点

    • 处理开始/结束空值而不进行任何修改
    • 需要更少的内存

    <强>缺点

    • 做了一些不同的事情......!
    • 可能需要多次迭代
    • 在悲观情况下需要更多时间