找出一个数组中是否至少有一次从1到K的所有数字
Find if in an array there are at least once all the numbers from 1 to K
昨天我在C++上做了一个面试测试,我不得不在下面的代码中发现错误。
该算法输入一个按非递减顺序排序的整数向量和一个整数K。如果向量只包含1和K之间的所有数字至少一次,则该算法返回true,否则返回false:
([1,1,2,3,4],4(-->真实
([1,1,3],3(-->错误
这就是实现:
bool algorithm(vector<int> &A, int k)
{
n = A.size();
for(int i = 0; i < n-1; i++)
{
if(A[i]+1 < A[i+1])
return false;
}
if(A[0] != 1 && A[n-1] != K)
{
return false;
}
else
{
return true;
}
}
我找不到bug。有人能告诉我这段代码中的错误在哪里吗?
最终检查应该是OR,因为任何一个条件都足以返回false。例如,([0,1,2],2(会像现在的代码一样通过。
此外,这可能是您的拼写错误,但k参数被引用为k(大小写错误(。
您只需要更改if条件
如果条件为,则更改第一
if ((A[i] != A[i+1]) && (A[i] + 1 != A[i+1]) {
return false;
}
如果条件为,则将第2个更改为
if (A[0] != 1 || A[n-1] != K) {
return false;
}
也许有点过头了,但保证是正确的:
bool algorithmc(vector<int>& A, int k)
{
int n = A.size();
//null checking
if (n < k)
return false;
// easy checking
if(A[0] != 1 || A[n-1] != k)
return false;
vector<int> flags(k + 1, 0);
for (int i = 0; i < n - 1; i++) {
// all data less than and equal to k
if (A[i] <= k)
flags[A[i]] = 1;
else
return false;
// check the input is valid
if (A[i + 1] < A[i])
return false;
}
//check the last one
if (A[n - 1] <= k)
flags[A[n - 1]] = 1;
else
return false;
// this is to make sure all data in range 1..k appear.
for (int i = 1; i <= k; i++)
if (!flags[i])
return false;
return true;
}
int n = A.size(); // int is missing
除了上面指出的那些之外,总体逻辑是不正确的。
我认为错误在于,如果给定空向量(没有空检查(,和/或以0开头的向量在应该失败时将通过测试。这是我的解决方案
bool algorithm(vector<int> &A, int k)
{
int n = A.size();
//if vector is size zero return false;
if(n <=0)
return false;
bool vector_dont_have_one = A[0] != 1;
bool vector_dont_have_k = A[n-1] != k;
if(vector_dont_have_one || vector_dont_have_k)
{
return false;
}
for(int i = 0; i < n-1; i++)
{
bool is_not_sorted = A[i]+1 < A[i+1];
if(is_not_sorted){
return false;
}
}
return true;
}
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 搜索字符串是否至少包含一次从 0 到 9 的所有数字的最有效方法
- 如何使用Mersenne Twister生成两个数字之间的所有值一次
- 如何一次读取一个数字并将其存储在数组中,跳过重复项
- 一次打印 2 个字节的十六进制数字
- 生成一个rand()%25,其中每个数字只能出现一次
- c++将输出(数字)保存到一个数组中.一次两个数字
- 使用位运算符查找在数组中只出现一次的数字
- 找出一个数组中是否至少有一次从1到K的所有数字
- 一个数字只出现一次
- c++ rand()每个数字只使用一次