如何找到数组中倒数第二个出现的索引?

时间:2019-11-01 15:44:58

标签: c++

例如,如果我有一个像[1, 1, 3, 5, 2, 0, 0, 5, 7]这样的数组,则元素5的最新出现将在第4个索引处(考虑到数组是从1开始索引的)。

1 个答案:

答案 0 :(得分:4)

天真的方法:

  1. 具有两个变量matchingIndexlastMatchingIndex(将它们初始化为-1或显而易见的变量)
  2. 遍历数组
  3. 遇到匹配项时,将matchingIndex移至lastMatchingIndex,然后将当前索引放入matchingIndex
  4. 到达终点后,lastMatchingIndex包含您想要的索引(从0开始!),除非它为-1,否则就意味着没有两个匹配项。

更优雅的方法

  1. 具有两个变量matchingIndexnumMatches(将其初始化为0)
  2. 通过数组向后滚动向后
  3. 遇到匹配项时,将当前索引放入matchingIndex中并递增numMatches
  4. 如果numMatches为2,则停止。
  5. 如果到达数组的开头时numMatches不是2,则说明没有两个匹配项,所以没有结果

我想您会承认这实际上非常简单。您实际上只是在记录和计数比赛,然后在获得想要的比赛时就停止。

#include <vector>
#include <iostream>

int main()
{
    const std::vector<int> v{1, 1, 3, 5, 2, 0, 0, 5, 7};
    const int searchFor = 5;

    int matchingIndex = -1;
    int numMatches = 0;

    for (int i = v.size()-1; i >= 0; --i)
    {
        if (v[i] == searchFor)
        {
            numMatches++;
            matchingIndex = i;

            if (numMatches == 2)
                break;  // no point continuing!
        }
    }

    if (numMatches == 2)
        std::cout << "Found second-to-last instance of '" << searchFor << "' at index " << matchingIndex << '\n';
    else
        std::cout << "No matches, or only one match\n";
}

live demo

使用算法的版本:

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    const std::vector<int> v{1, 1, 3, 5, 2, 0, 0, 5, 7};
    const int searchFor = 5;

    // First match from end
    auto it = std::find(std::rbegin(v), std::rend(v), searchFor);

    // Second match from end
    if (it != std::rend(v))
        it = std::find(it+1, std::rend(v), searchFor);

    if (it != std::rend(v))
        std::cout << "Found second-to-last instance of '" << searchFor << "' at index " << std::distance(std::begin(v), it.base()) << '\n';
    else
        std::cout << "No matches, or only one match\n";
}

live demo