【发布时间】:2016-07-14 21:26:24
【问题描述】:
我有一个面试问题,我的算法只通过给定的示例测试用例,并没有通过所有测试用例。
问题:给定一个排序的整数数组,返回数组的总和,使每个元素都是唯一的,方法是向重复元素添加一些数字,使唯一元素的总和最小。
即,如果数组中的所有元素都是唯一的,则返回总和。 如果某些元素是重复的,则将它们递增以确保所有元素都是唯一的,从而使这些唯一元素的总和最小。
一些例子:
-
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;
}
我看不到该算法失败的其他输入。 我能想到的其他输入示例是
{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
还有哪些其他测试用例和可以通过所有用例的算法?
有些人抱怨问题不清楚。我想让你知道这个问题。如果只允许正数或正数和负数,则没有关于添加的数字的明确描述。给定三个带有输入和输出的示例,以及其他一些您不允许看到的输入和输出案例,编写一个程序来传递所有其他看不见的输入/输出案例。这就是问题所在。
【问题讨论】:
-
在您的最后一个测试用例中,您正在从第二个索引中删除 1。但是,在您的问题中,您说您只能通过“如果重复添加最小数量”来使其唯一。
-
如果只允许加数字,
{1, 2, 4, 4, 7, 7, 8}应该如何变成{1, 2, 3, 4, 6, 7, 8}? -
所以只要数组保持排序,就可以添加负数?
-
一个测试用例可能是一个 int,它在 Integer 的最大范围内。导致溢出。您可能需要在递增之前向上转换很久以避免这种情况。您的总和可能还需要是一个大整数或双精度数。