数组的子序列

时间:2016-11-08 07:37:50

标签: c++ arrays loops

此函数计算最大可能数x,使得所有数字1,... x-1都在一个数组中,例如{1,3,2,5} - > 4.函数不适用于零的数组,因为它总是返回1.为什么?

int array(int* t, int r)
{
    for (int x = 0; x < r; x++)
    {
        for (int y = 0; y < r-1; y++)
        {
            if (t[y] > t[y+1])
            {
                int temp = t[y+1];
                t[y+1] = t[y];
                t[y] = temp;
            }
        }
    }
    for (int i = 0; i != r; i++)
    {
        if (t[i] != (i + 1))
        {
            return i+1;
        }
    }
    return r+1;
}

2 个答案:

答案 0 :(得分:2)

让我们分解您的代码

<facepalm>D'oh!</facepalm>

这是一种排序算法(冒泡排序,种类)。因此,在这些循环之后,我们可以假设您的数组已经排序。

现在,如果您查看下一个for循环,循环将检查每个i的第(i + 1)个数字的存在。这意味着,在第一次迭代(i = 0)中,它将在第0位置检查1(i + 1)。如果没有找到,则返回该值或继续搜索。如果一切顺利,它将返回r + 1(数组大小+ 1)。

for(int x=0;x<r;x++){
   for(int y=0; y<r-1;y++){
       if(t[y]>t[y+1]){
          int temp=t[y+1];
          t[y+1]=t[y];
          t[y]=temp;
      }
   } }  

现在,如果数组中有一个0(全部为正数),它将始终占据第一个位置(第0个索引)。因此它返回1,因为它在第0个索引中期望为1。

如果你理解这一点,我不会想到,你也很难适应0。

答案 1 :(得分:1)

检查已排序数字的序列时,检查t[i] == i+1,如果i元素位于i位置。这仅适用于序列以1开头的情况。相反,您应检查i+1元素是i元素+1,所以

if (t[i]+1 != t[i+1]) {
  return t[i] + 1;
}