查看 deque 中两个相等数字之间的长度是否为偶数

See if length between two equal numbers in deque is even

本文关键字:之间 是否 数字 deque 两个 查看      更新时间:2023-10-16

我有一个deque<int>,我想找出两个相等数字之间的int数是否是偶数。例如:7,13,4,6,4,13,8,10应该是假的,1,3,5,3,4,8,7,9,6,5,7应该是真的。我认为我的程序是正确的,但是由于某种原因,它在这两种情况下都输出为真。知道为什么吗?PS:我不擅长迭代器。


#include <iostream>
#include <deque>
using namespace std;
  bool isJoined ( deque<int>::iterator begin, deque<int>::iterator end )
 {
    for(auto i = begin ; i < end ;i++)
      for(auto j=i+1;j<end;j++)
        if(*i == *j && (j-i)%2 == 0)
          return true;    
   return false;
 }
int main()
{    
   deque<int> test = {1,3,5,3,4,8,7,9,6,5,7};   
   deque<int> test2 = {7,13,4,6,4,13,8,10};
   cout<<isJoined(test.begin(),test.end())<<endl;
   cout<<isJoined(test2.begin(),test2.end())<<endl;
}

这里有一个错误:

if(*i == *j && (j-i)%2 == 0)

你想严格计算迭代器之间的数字数量......这是针对您想要2 [1, 2, 3, 1],但是迭代器之间的差异会给您带来3。因此,您需要:

if (*i == *j && (j-i+1)%2 == 0)

if (*i == *j && (j-i)%2 == 1)

此外,您可能会发现仅使用索引运算符并完全避免迭代器更容易:

bool isJoined(const deque<int>& deq)
{
    for (size_t i = 0; i < deq.size(); ++i) {
        for (size_t j = i+1; j < deq.size(); ++j) {
            if (deq[i] == deq[j] && (j-i)%2 == 1) {
                return true;
            }
        }
    }
    return false;
}

这样还可以让你跨越内部循环:

for (size_t j = i+1; j < deq.size(); j += 2) {
    // already enforcing an even number of numbers in bewteen
    if (deq[i] == deq[j]) return true; 
}