C++中的第一个覆盖前缀-我的代码出了什么问题
first covering prefix in C++ - what is wrong with my code?
我刚刚在C++中做了一个小的可编码性测试。。。用于第一覆盖前缀。如本文所定义,
给出了一个由N个整数组成的非空零索引数组A。数组A的第一个覆盖前缀是最小整数P,使得0 ≤ P < N
并且使得出现在数组A中的每个值也出现在序列A[0], A[1], ..., A[P]
中。
例如,以下5元素数组A的第一个覆盖前缀:
A[0] = 2
A[1] = 2
A[2] = 1
A[3] = 0
A[4] = 1
是3,因为序列[ A[0], A[1], A[2], A[3] ]
等于[2, 2, 1, 0]
,包含数组A中出现的所有值。
编写一个函数
class Solution { public int ps(int[] A); }
给定由N个整数组成的零索引非空数组a,返回a的第一个覆盖前缀。
假设:
- N是[1..1000000]范围内的整数
- 数组A的每个元素都是[0..N−1]范围内的整数
例如,给定阵列A,使得
A[0] = 2
A[1] = 2
A[2] = 1
A[3] = 0
A[4] = 1
函数应该返回3,如上所述。
复杂性:
- 预期的最坏情况时间复杂度为O(N)
- 预期最坏情况下的空间复杂度为O(N),超出输入存储(不计算输入自变量所需的存储)
我的解决方案如下(并不是说它是最优的)。。。然而,它只得到了48/100的分数……想知道你们中是否有人能看到导致错误答案的代码问题?感谢
int ps ( int A[], int N )
{
long unique_array [N-1];
memset( unique_array, -1, N - 1 );
long value = 0, counter = 0, unique_num = 0, index = 0;
for ( counter; counter < N; counter++ )
{
value = A[counter];
if ( unique_array[value] < 0 )
{
unique_array[value] = value;
unique_num ++;
}
}
for ( counter = 0; counter < N; counter++ )
{
value = A[counter];
if ( unique_array[value] >= 0 )
{
unique_array[value] = -1;
unique_num --;
if ( unique_num == 0 )
index = counter;
}
}
return index;
}
数组unique_array
的长度应该是N
,而不是N-1
:
long unique_array[N]; // not N-1
此外,memset
不会将阵列的所有元素设置为-1
;使用一个循环来做到这一点:
for ( counter = 0; counter < N; counter++ )
{
unique_array[counter] = -1;
}
实际上,您只需要一个位数组,而不需要long
值。您可以将数组初始化为0,并将单个条目设置为1,而不是value
:
#define FALSE 0
#define TRUE 1
if ( unique_array[value] == FALSE )
{
unique_array[value] = TRUE;
unique_num ++;
}
如果你做了这个改变,那么你可以在没有显式循环的情况下将数组初始化为0:
int unique_array[N] = {0}; // this syntax only works with 0, not with -1
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 0-1背包代码中的错误.我的代码中有什么错误
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 这行代码在C++类中意味着什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 此代码中的操作流程是什么?C/C++.
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 此代码验证公式是什么意思?
- 需要以下代码的帮助,下面的代码有什么问题
- C++标准提案代码:什么是 N 和 P?
- C - 哈希算法代码什么都没有返回
- 将"12345678"转换为"1-234-5678",我的代码什么也没产生
- 在编译过程中,琐碎的(没有效果的)代码什么时候会被删除
- 有人能告诉我为什么这个代码什么都不打印吗