例如,如果我有一个像[1, 1, 3, 5, 2, 0, 0, 5, 7]
这样的数组,则元素5的最新出现将在第4个索引处(考虑到数组是从1开始索引的)。
答案 0 :(得分:4)
天真的方法:
matchingIndex
和lastMatchingIndex
(将它们初始化为-1或显而易见的变量)matchingIndex
移至lastMatchingIndex
,然后将当前索引放入matchingIndex
lastMatchingIndex
包含您想要的索引(从0开始!),除非它为-1,否则就意味着没有两个匹配项。更优雅的方法
matchingIndex
和numMatches
(将其初始化为0)matchingIndex
中并递增numMatches
numMatches
为2,则停止。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";
}
使用算法的版本:
#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";
}