【问题标题】:Linear search in a array is returning unexpected results数组中的线性搜索返回意外结果
【发布时间】:2017-10-21 02:43:36
【问题描述】:

我需要开发一个线性搜索算法来测试数组是否包含testVal

这是我写的

bool Contains(int a[], int arraySize, int testVal)
{

        bool contains = 0;
        for (int i = 0; i < arraySize; ++i)
        {
            if (a[i] == testVal)
            {
                contains = true;
                std::cout << "true" << std::endl;
            }
            else if (a[i] != testVal)
            {
                contains = false;
                std::cout << "false" << std::endl;
            }
        }
        return contains; }

当它调试时它打印正确,但它也打印 19 "false"。我想这与数组大小为 20 有关。我不知道如何将其修复为只打印一次而没有 19“假”。谁能告诉我怎么了?

【问题讨论】:

  • 想想找到值后如何停止循环。

标签: c++ arrays boolean


【解决方案1】:

您需要做的就是将以下条件放入您的 for 循环中:

bool contains = false;
for (int i = 0; i < arraySize && !contains; ++i)

在不更改代码中的任何其他内容的情况下运行的原因是 contains 在找到值时设置为 true

因此在下一次迭代中(如果您还没有到达数组的末尾)循环的条件i &lt; arraySize &amp;&amp; !contains 将是false,从而终止循环。

另一种看待它的方式是,如果! 令人困惑,以下几行会做同样的事情:

bool contains = false;
for (int i = 0; i < arraySize && (contains == false); ++i)

仅当i &lt; arraySizecontains 值为false 时循环才会继续。由于您在找到值时将contains 设置为true,因此for 循环将在下一次迭代中终止。

【讨论】:

    【解决方案2】:

    一旦你发现它包含 testVal 或者你可以打破 for 循环,你应该返回。返回更好,并在下面的代码中以最小的更改完成。

    bool Contains(int a[], int arraySize, int testVal)
    {
    
        bool contains = 0;
        for (int i = 0; i < arraySize; ++i)
        {
            if (a[i] == testVal)
            {
                contains = true;
                std::cout << "true" << std::endl;
                return contains;
            }
            else if (a[i] != testVal)
            {
                contains = false;
                std::cout << "false" << std::endl;
            }
        }
        return contains; }
    

    您也可以在找到匹配项时更新包含,如下面的代码所示。在此代码中,您可能不必在 for 循环中使用 return。但是如果你这样做,你的代码会更快,因为它不会等待终止循环。

    bool Contains(int a[], int arraySize, int testVal)
    {
    
        bool contains = false;
        for (int i = 0; i < arraySize; ++i)
        {
            if (a[i] == testVal)
            {
                contains = true;
                std::cout << "true" << std::endl;
            }
        }
        return contains; }
    

    【讨论】:

      【解决方案3】:

      首先,你只需要在找到contains的时候改变它的值,并将false设置为默认值,这样当搜索到数组末尾时,仍然没有找到,结果将是false

      如果找到了,将contain设置为truebreak跳出循环,因为已经找到了,不需要进一步测试

      ++i改成i++,不同的是++i是在嵌套代码执行之前加上的,这样如果你用10的arraySize,你的循环就会是1到9,也就是9 次,与i++ 相比,i 是在嵌套执行后添加的,因此使用相同的arraySize,您的循环将是 0 到 9,即 10 次

      bool Contains(int a[], int arraySize, int testVal)
      {
          bool contains = false;
          for (int i = 0; i < arraySize; i++)
          {
              if (a[i] == testVal)
              {
                  contains = true;
                  std::cout << "true" << std::endl;
                  break;
              }
          }
          return contains; 
      }
      

      【讨论】:

        【解决方案4】:
        bool Contains(int a[], int arraySize, int testVal)
        {   
        
        
        bool contains = false;
        for (int i=0;i<arraySize;i++)
        {
            if (a[i] == testVal)
            {
                contains = true;
                std::cout << "true" << std::endl;
                return contains;
            }
        }
        return contains; }
        

        您必须使用 i++ 而不是 ++i 并且必须在 if 块中使用 return 语句,以便在找到 testval 时比不进行进一步的测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          • 2021-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-26
          相关资源
          最近更新 更多