最小唯一数组和

use*_*895 11 arrays algorithm

我得到了一个面试问题,我的算法只通过给出了示例测试用例,并没有通过所有测试用例.

问题:给定一个排序的整数数组,返回数组的总和,使每个元素通过向重复元素添加一些数字而唯一,以便唯一元素的总和最小.

即,如果数组中的所有元素都是唯一的,则返回总和.如果某些元素是重复的,则递增它们以确保所有元素都是唯一的,以便这些唯一元素的总和最小.

一些例子:

  • input1[] = { 2, 3, 4, 5 }=> return 19= 2 + 3 + 4 + 5(所有元素都是唯一的,所以只需将它们加起来)
  • input2[] = { 1, 2, 2 }=> return 6= 1 + 2 + 3(索引2重复,因此增加它)
  • input3[] = { 2, 2, 4, 5 }=> return 14= 2 + 3 + 4 + 5(索引1是重复的,所以增加它)

这三个是问题中的例子,我的简单算法如下并通过给定的三个例子,但没有通过其他我无法看到输入的情况.

static int minUniqueSum(int[] A) {
    int n = A.length;


    int sum = A[0];
    int prev = A[0];

    for( int i = 1; i < n; i++ ) {
        int curr = A[i];

        if( prev == curr ) {
            curr = curr+1;
            sum += curr;
        }
        else {
            sum += curr;
        }
        prev = curr;
    }

    return sum;
}
Run Code Online (Sandbox Code Playgroud)

我看不到此算法失败的其他输入.我能想到的其他输入例子是

{1, 1, 1, 1}  --> {1, 2, 3, 4}
{1, 1, 2, 2, 3, 3, 3} --> {1, 2, 3, 4, 5, 6, 7}

{1, 2, 4, 4, 7, 7, 8} --> I think this should be {1, 2, 3, 4, 6, 7, 8}  and my algorithm fails in this example because my algorithm has {1, 2, 4, 5, 7, 8, 9} whose sum is not minimum 
Run Code Online (Sandbox Code Playgroud)

什么是其他测试用例和可以通过所有案例的算法?

有些人抱怨问题不明确.我想告诉你这个问题.如果仅允许正数或正数和负数,则没有关于添加数字的明确描述.给出了三个输入和输出示例,以及一些您不允许看到的输入和输出情况,编写程序以传递所有其他看不见的输入/输出情况.这是个问题.

Ami*_*mit 6

例如,在具有更多重复值的情况下,您的算法将失败

2,2,2

你会得到7而不是9.

使用您的算法的最小修复将是:

static int minUniqueSum(int[] A) {
    int n = A.length;

    int sum = A[0];
    int prev = A[0];

    for( int i = 1; i < n; i++ ) {
        int curr = A[i];

        if( prev >= curr ) {
            curr = prev+1;
        }
        sum += curr;
        prev = curr;
    }

    return sum;
}
Run Code Online (Sandbox Code Playgroud)

*正如评论中指出的那样,无需对已排序的数组进行排序.