我得到了一道面试题,我的算法只通过了给定的测试案例,没有通过所有的测试案例。
问题:给定一个已排序的整数数组,返回将重复元素变为唯一元素所需添加的数字的和,使得这些唯一元素的和最小。
也就是说,如果数组中的所有元素都是唯一的,则返回它们的和。 如果有一些元素是重复的,则增加它们的值以确保所有元素都是唯一的,并使得这些唯一元素的和最小。
以下是一些示例:
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, 2, 4, 4, 7, 7, 8}
转化为{1, 2, 3, 4, 6, 7, 8}
? - tobias_k