查找数组中是不是至少有一次从 1 到 K 的所有数字

Posted

技术标签:

【中文标题】查找数组中是不是至少有一次从 1 到 K 的所有数字【英文标题】:Find if in an array there are at least once all the numbers from 1 to K查找数组中是否至少有一次从 1 到 K 的所有数字 【发布时间】:2015-09-22 20:23:26 【问题描述】:

昨天我在面试中做了一个C++测试,我不得不在下面的代码中找到错误。

该算法将输入一个按非降序排序的整数向量和一个整数 K。如果该向量仅包含 1 和 k 之间的所有数字并且至少包含一次,则该算法返回 true,否则返回 false:

([1,1,2,3,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;
   

我无法找到错误/错误。有人能告诉我这段代码中的错误在哪里吗?

【问题讨论】:

您是否尝试过创建一些测试用例并使用调试器单步执行代码?它可能会在很大程度上帮助您弄清楚这一点并在未来更好地回答这样的问题。 调试器对于发现问题非常有帮助。 Stack Overflow 不是从长远角度来看的。 还没有。他们在没有使用调试器的情况下为您提供了这一点,因此在没有调试器的帮助的情况下也可以解决这个问题。我试图用其他一些测试用例来思考和推理,但我没有看到错误。 “不递减”是什么意思? 可能我用错了术语。我的意思是不减少i &lt;= i+1 【参考方案1】:

最后的检查应该是 OR,因为任何一个条件都是返回 false 的充分理由。例如,([0,1,2],2) 会像现在的代码一样通过。

另外,这可能是您的拼写错误,但 k 参数被引用为 K(大小写错误)。

【讨论】:

【参考方案2】:

你只需要改变if条件

将第一个 if 条件更改为

if ((A[i] != A[i+1]) && (A[i] + 1 != A[i+1]) 
    return false;

将第二个 if 条件更改为

if (A[0] != 1 || A[n-1] != K) 
    return false;

【讨论】:

如果 (A[0] != 1 || A[n-1] != K) 就足够了【参考方案3】:

可能有点过头了,但保证是正确的:

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;

【讨论】:

【参考方案4】:
int  n = A.size(); // int is missing

除了上面指出的以外,整体逻辑不正确。

【讨论】:

以上是关于查找数组中是不是至少有一次从 1 到 K 的所有数字的主要内容,如果未能解决你的问题,请参考以下文章

判断一个数组是不是至少有一个重复项的最快算法

面试题---找出数组中两个只出现一次的数

K-th Number

查找数组中的最小更改数以进行 k 算术级数

查找最多具有 k 个奇数元素的不同连续子数组的数量

LeetCode 1012 至少有 1 位重复的数字