七月问答题目

来源:互联网 发布:编译c语言的软件 编辑:程序博客网 时间:2024/06/05 09:17

题目来自于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;}
0 0
原创粉丝点击