七月问答题目

题目来自于http://ask.julyedu.com/

1.五笔编码计算

int factor[]={25^3+25^2+25+1,25^2+25+1,25+1,1};
bcde=a->b+ba->bc+bca->bcd+bcda->bcde
=0+factor[0]*(b-a)+1+factor[1]*(c-a)+1+factor[2]*(d-a)+1+factor[3]*(e-a)
=3+factor[0]*(b-a)+factor[1]*(c-a)+factor[2]*(d-a)+factor[3]*(e-a)
int factor[]={25*25*25+25*25+25+1,25*25+25+1,25+1,1};

int encode(string s)
{
    int index=s.size()-1;
    for(int i=0;i<s.size();++i)
    {
        index+=factor[i]*(s[i]-'a');
    }
    return index;
}

2.第一个只出现一次的字符

char firstChar(string s)
{
    vector<int> vec(256,0);
    for(int i=0;i<s.size();++i)++vec[int(s[i])];
    for(int i=0;i<s.size();++i)
    {
        if(vec[int(s[i])]==1)return s[i];
    }
}

3.删除特定的字符

string deleteChar(string s,string t)
{
    unordered_set<char> set;
    string result;
    for(int i=0;i<t.size();++i)set.insert(t[i]);
    for(int i=0;i<s.size();++i)
    {
        if(set.find(s[i])==set.end())result+=s[i];
    }
    return result;
}

4.均分01串
最多两刀。考虑长度为串长的一半的窗,从左往右遍历,如果第一个窗中0的个数等于0的个数的一半,则只需中间一刀即可;如果第一个窗中0的个数大于0的个数的一半,则最后一个窗中0的个数小于0的个数的一半,从左往右遍历时,0的个数要么不变,要么+1,要么-1,根据“连续性”,一定存在一个窗中0的个数等于0的个数的一半。

#include<iostream>
#include<string>
using namespace std;

int main()
{  
    string s="00001111";
    int num=0;
    for(int i=0;i<s.size()/2;++i)
    {  
        if('0'==s[i])++num;    
    }  
    for(int i=0;i<s.size()/2;++i)
    {
        if(num==2)   //0的个数的一半为2
        {
            cout<<i<<endl;
            break;
        }
        if('0'==s[i]&&'1'==s[i+s.size()/2])--num;
        if('1'==s[i]&&'0'==s[i+s.size()/2])++num; 
    }
    return 0;  
}   

5.交替字符串

bool isAlternated(string s1,string s2,string s3)
{
    vector<vector<bool> > f(s1.size()+1,vector<bool>(s2.size()+1,false));
    f[0][0]=true;
    for(int i=0;i<s1.size();++i)
    {
        if(s1[i]==s3[i])f[i+1][0]=true;
        else break;
    }
    for(int j=0;j<s2.size();++j)
    {
        if(s2[j]==s3[j])f[0][j+1]=true;
        else break;
    }
    for(int i=1;i<=s1.size();++i)
    {
        for(int j=1;j<=s2.size();++j)
        {
            if(f[i-1][j]&&s1[i-1]==s3[i+j-1])f[i][j]=true;
            else if(f[i][j-1]&&s2[j-1]==s3[i+j-1])f[i][j]=true;
        }
    }
    return f[s1.size()][s2.size()];
}

6.奇偶调序问题
(1)前后两个指针往中间扫

void partition(vector<int> &vec)
{
    int i=0,j=vec.size()-1;
    while(i<j)
    {
        while(vec[i]&1)++i;
        while((vec[j]&1)==0)--j;
        if(i<j)swap(vec[i++],vec[j--]);
    }
}

(2)快排的一次partition(&1等于1排前面,&1等于0排后面)

void partition(vector<int> &vec)
{
    int i=-1;
    for(int j=0;j<vec.size();++j)
    {
        if(vec[j]&1)swap(vec[++i],vec[j]);
    }
}

7.最长连续字符
DC

8.字符串包含

bool containString(string s,string t)
{
    vector<int> vec(256,0);
    for(int i=0;i<s.size();++i)++vec[int(s[i])];
    for(int i=0;i<t.size();++i)
    {
        if(--vec[int(t[i])]<0)return false;
    }
    return true;
}

18.一起刷Leetcode(198) House Robber

int f(vector<int> vec)
{
    int f1=0,f2=0;
    for(int i=0;i<vec.size();++i)
    {
        int tmp=f1;
        f1=max(f1,f2+vec[i]);
        f2=tmp;
    }
    return f1;
}

你可能感兴趣的:(七月问答题目)