找出一个数组中是否至少有一次从1到K的所有数字

Find if in an array there are at least once all the numbers from 1 to K

本文关键字:一次 数字 一个 数组 是否      更新时间:2023-10-16

昨天我在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;
}