【问题标题】:Determine if the second array is the first array shifted to the right by 1判断第二个数组是否是第一个右移 1 的数组
【发布时间】:2021-08-30 02:06:30
【问题描述】:

问题是判断第二个数组是否是第一个右移1的数组。 例子: simonSays([1, 2, 3, 4, 5], [0, 1, 2, 3, 4]) ➞ 真 simonSays([1, 2, 3, 4, 5], [5, 5, 1, 2, 3]) ➞ false

我的代码如下:

bool simonSays(std::vector<int> arr1, std::vector<int> arr2) {
    
    for(int i=0; i<arr1.size(); i++)
        if(arr1[i]==arr2[i+1]) 
        return true;
    
    return false;
}

但是,我的代码在这个测试用例上失败了。我的输出是真的,但实际上应该是假的:

It(Test4){Assert::That(simonSays({1, 2, 3, 4, 5}, {0, 1, 2, 3, 3}), Equals(false));}

我的代码有什么问题?

【问题讨论】:

  • 你在最后一个元素处越界了。你需要绕到前面。
  • @GaryHoliday 我觉得我不太明白,能否请您详细说明一下?
  • 你能更准确地说“向右移动 1”是什么意思吗?您的测试用例似乎正在寻找将所有值调整为 1,但代码正在检查值是否已移动位置。
  • 您的代码假定 arr2 的元素比 arr1 多,因为它在循环的最后一次迭代中访问 arr2[arr1.size()+1]`。失败的测试用例有arr1.size() == arr2.size(),所以访问arr2[array2.size()] 会给出未定义的行为。

标签: c++ arrays vector


【解决方案1】:

您需要执行额外的检查,以免访问超出arr2 的范围:

// You should prefer const references to avoid copying of the vectors in the parameters
bool simonSays(std::vector<int> const& arr1, std::vector<int> const& arr2) {
    for (int i = 0; i < arr1.size() && i + 1 < arr2.size(); i++)
        /* The problem with using 'arr[i] == arr2[i + 1]' is that it stops iterating any
           further just after the first instance of finding an equal element in the
           two vectors, so use it's inverse, i.e., 'arr[i] != arr[i + 1]' */
        if(arr1[i] != arr2[i + 1]) 
            return false;
    return true;
}

或者,您可以在 C++ 标准库中的 std::equal() 的帮助下编写这样的整个函数:

#include <algorithm>

// ...

bool simonSays(std::vector<int> const& arr1, std::vector<int> const& arr2) {
    return std::equal(std::next(arr2.begin()), arr2.end(), arr1.begin());
}

【讨论】:

  • 谢谢,我现在完全明白了:)
【解决方案2】:

我的代码有什么问题?

  • 如果有任何比较匹配,则返回true。由于第一个比较在您的测试用例中匹配,因此结果为真。
  • 您没有检查第二个数组的大小。
  • 即使数组大小相同,最后一次迭代也会访问超出其边界的第二个数组,并且程序的行为将是未定义的。当所有比较都不匹配时,就会出现这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多