您的位置:首页 > 职场人生

面试题精选(87):两数组包含问题(来自微软面试题)

2010-03-26 22:01 676 查看
题目:

You have given two arrays, say

A: 4, 1, 6, 2, 8, 9, 5, 3, 2, 9, 8, 4, 6
B: 6, 1, 2, 9, 8

where B contains elements which are in A in consecutive locations but may be in any order.
Find their starting and ending indexes in A. (Be careful of duplicate numbers).

 

answer is (1,5)

 

先给出代码,再结合代码解释,如下:

#include <iostream>
#include <map>

using namespace std;

void FindConsecutiveSubarrLocation(int A[], int lenA, int B[], int lenB)
{
map<int, int> bmap;
map<int, int> windowmap;
map<int, int> diffmap;
for(int i = 0; i< lenB; i++)
{
if(bmap.count(B[i]) == 0)
bmap[B[i]] = 1;
else
++bmap[B[i]];
if(windowmap.count(A[i]) == 0)
windowmap[A[i]] = 1;
else
++windowmap[A[i]];
}

map<int, int>::iterator it = bmap.begin();
int sameElement = 0;
while(it != bmap.end())
{
if(windowmap.count((*it).first) != 0)
{
diffmap[(*it).first] = windowmap[(*it).first] - (*it).second;
if(diffmap[(*it).first]  == 0)
sameElement++;
}
else
diffmap[(*it).first] = -(*it).second;;
it++;
}

if(sameElement == lenB)
{
cout<<"----------find one---------"<<endl;
cout<<"start index:"<<0<<endl;
cout<<"end index:"<<lenB-1<<endl;
}

for(int i = lenB; i < lenA; i++)
{
if(diffmap.count(A[i-lenB]) != 0)
{
diffmap[A[i-lenB]]--;
if(diffmap[A[i-lenB]] == 0)
sameElement++;
else if(diffmap[A[i-lenB]] == -1)
sameElement--;
}
if(diffmap.count(A[i]) !=0)
{
diffmap[A[i]]++;
if(diffmap[A[i]] == 0)
sameElement++;
else if(diffmap[A[i]] == 1)
sameElement--;
}
if(sameElement == diffmap.size())
{
cout<<"----------find one---------"<<endl;
cout<<"start index:"<<i-lenB+1<<endl;
cout<<"end index:"<<i+1<<endl;
}
}
}

int main()
{
int A[] = {4, 1, 2, 1, 8, 9, 2, 1, 2, 9, 8, 4, 6};
int B[] = {1, 1, 2, 8, 9};
int lenA = sizeof(A)/sizeof(int);
int lenB = sizeof(B)/sizeof(int);
FindConsecutiveSubarrLocation(A, lenA, B, lenB);
return 0;
}


 

 

思路:

ex,

    int A[] = {4, 1, 2, 1, 8, 9, 5, 3, 2, 9, 8, 4, 6};
    int B[] = {1, 1, 2, 8, 9};
    int lenA = 13;
    int lenB = 5;
    map<int,int> bmap;
    map<int,int> windowmap;
    map<int,int> diffmap;

首先初始化map:
    bmap = {1:2, 2:1, 8:1,9:1} 
    windowmap = {1:2,  2:1, 4:1,8:1}
    diffmap = {1:0, 2:0, 8:0, 9:-1}
    其中"1: 0" 意味着数组A的当前滑动窗口正好和数组B包含相同数量的"1",而 " 9:-1" 则表示A当前的滑动窗口和B比较缺少1个"9"。 并且我们注意到diffmap和bmap拥有相同的key

     代码中的变量"sameElement"代表的是diffmap中有多少pair与bmap匹配, 显然,初始化后的“sameElement”变量值会是3 ( 1:0, 2:0, 8:0 in diffmap).

接下来
        在数组A中滑动size为lenB的窗口,没向前滑动一步,只需check滑动窗口左侧划出的元素El和右侧滑入的元素Er,更新diffmap和sameElement,如下:

       if(diffmap.count(A[i-lenB]) != 0)
        {
            diffmap[A[i-lenB]]--;
            if(diffmap[A[i-lenB]] == 0)
                sameElement++;
            else if(diffmap[A[i-lenB]] == -1)
                sameElement--;
        }
        if(diffmap.count(A[i]) !=0)
        {
            diffmap[A[i]]++;
            if(diffmap[A[i]] == 0)
                sameElement++;
            else if(diffmap[A[i]] == 1)
                sameElement--;
        }
        if(sameElement == diffmap.size())
        {
            cout<<"----------find one---------"<<endl;
            cout<<"start index:"<<i-lenB+1<<endl;
            cout<<"end index:"<<i+1<<endl;
        }

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐