【程式設計師面試金典】20180801

HelloZEX發表於2018-08-01

題目描述

現有一些隨機生成的數字要將其依次傳入,請設計一個高效演算法,對於每次傳入一個數字後,算出當前所有傳入數字的中位數。(若傳入了偶數個數字則令中位數為第n/2小的數字,n為已傳入數字個數)。

給定一個int陣列A,為傳入的數字序列,同時給定序列大小n,請返回一個int陣列,代表每次傳入後的中位數。保證n小於等於1000。

測試樣例:

[1,2,3,4,5,6],6
返回:[1,1,2,2,3,3]
class Middle {
public:
    vector<int> getMiddle(vector<int> A, int n) {
        // write code here
        vector<int> maxheap;
        vector<int> minheap;
        vector<int> re;
        for(int i=0;i<n;++i)
            {
            if(maxheap.size()==minheap.size())
                {
                if(minheap.size()>0&&minheap.front()<A[i])
                    {
                    pop_heap(minheap.begin(),minheap.end(),greater<int>());
                    maxheap.push_back(minheap.back());
                    push_heap(maxheap.begin(),maxheap.end(),less<int>());
                    minheap.pop_back();
                     
                    minheap.push_back(A[i]);
                    push_heap(minheap.begin(),minheap.end(),greater<int>());
                }
                else
                    {
                    maxheap.push_back(A[i]);
                    push_heap(maxheap.begin(),maxheap.end(),less<int>());
                }
            }
            else
                {
                if(maxheap.front()>A[i])
                    {
                    pop_heap(maxheap.begin(),maxheap.end(),less<int>());
                    minheap.push_back(maxheap.back());
                    push_heap(minheap.begin(),minheap.end(),greater<int>());
                    maxheap.pop_back();
                     
                    maxheap.push_back(A[i]);
                    push_heap(maxheap.begin(),maxheap.end(),less<int>());
                }
                else
                    {
                    minheap.push_back(A[i]);
                    push_heap(minheap.begin(),minheap.end(),greater<int>());
                }
            }
            //if(maxheap.size()==minheap.size())
            //  re.push_back(minheap.front());
            //else
                re.push_back(maxheap.front());
        }
        return re;
    }
};
/*
class Middle 
{
public:
    vector<int> getMiddle(vector<int> A, int n) 
    {
        // write code here
        //插入排序
        vector<int> result;
        result.push_back(A[0]);
        for(int i=1;i<n;i++)
        {
            int k=i;
            while(k>0)
            {
                if(A[k]<A[k-1])
                    swap(A[k],A[k-1]);
                else
                    break;
                k--;
            }
            result.push_back(A[i/2]);
        }
        return result;
    }
};
*/


題目描述

現有一個字典,同時給定字典中的兩個字串s和t,給定一個變換,每次可以改變字串中的任意一個字元,請設計一個演算法,計算由s變換到t所需的最少步數,同時需要滿足在變換過程中的每個串都是字典中的串。

給定一個string陣列dic,同時給定陣列大小n,串s和串t,請返回由s到t變換所需的最少步數。若無法變換到t則返回-1。保證字串長度均小於等於10,且字典中字串數量小於等於500。

測試樣例:

["abc","adc","bdc","aaa”],4,”abc","bdc"
返回:2

BFS

class Change {
public:
    int countChanges(vector<string> dic, int n, string s, string t)
    {
        // write code here
        map<string,int> mapp;
        for(int i=0;i<n;i++)
        {
            mapp[dic[i]]=1;
        }
        //寬度優先搜尋
        queue<string> q;
        q.push(s);
        map<string,int> mapped;
        mapped[s]=1;
        //bool flag=false;  //標示是否能變換成功
        int cur=1;   //當前層待彈出節點數目
        int next=0;
        int step=0;
        while(!q.empty())
        {
            while(cur--)
            {
                string str=q.front();
                for(int i=0;i<str.size();i++)
                {
                    string ss=str;
                    for(char c='a';c<='z';c++)
                    {
                        ss[i]=c;
                        if(ss==t)
                        {
                            return ++step;
                        }
                        if(mapped[ss]==0&&mapp[ss]==1)
                        {
                            next++;
                            mapped[ss]=1;
                            q.push(ss);
                        }
                    }
                }
                    q.pop();
           }
           cur=next;
           next=0;
            step++;
        }
        return -1;
    }
};


 

相關文章