华为机试--牛客刷题

来源:互联网 发布:ac-尼尔森数据 编辑:程序博客网 时间:2024/06/05 05:27

1. 字符串最后一个单词的长度

int main()    {    string input;    while(getline(cin,input))        {        int size=input.size()-1;        int count=0;        while(input[size]!=' '&&size>=0)            {             size--;             count++;        }            cout<<count;    }    return 0;}int main()    {    string input;    while(getline(cin,input))        {        stringstream ss(input);        string word;        while(ss>>word)            ;        cout<<word.size();    }    return 0;}

2.计算字符串个数

int main(){    string input;      getline(cin,input);    map<char,int> index;    char ch;    cin>>ch;    for(int i=0;i<input.size();++i)        index[input[i]]++;    int res=index[toupper(ch)]+index[tolower(ch)];      cout<<res;}int numOfString(string s, char target);int main(){    string str;    int num;    char target;    getline(cin,str);    cin >> target;    num = numOfString(str, target);    cout << num << endl;}int numOfString(string s,char target) {    int res=0;    int len = s.size();    for (int i = 0; i < len; ++i)    {        if (s[i] == tolower(target) || s[i] == toupper(target))            ++res;    }    return res;}

3.排序,去重

void QuickSort(vector<int>& vec,int low,int high);int Partition(vector<int>& vec, int low, int high);vector<int> del(vector<int>& vec);int main()    {    int n;    while( cin>>n){        int index=n;        vector<int> vec;        while(index--)            {            int num;            cin>>num;            vec.push_back(num);        }        QuickSort(vec,0,vec.size()-1);        vector<int> res;        res=del(vec);        //vector<int>::iterator it=unique(vec.begin(),vec.end());        //vec.erase(it,vec.end());        for(int i=0;i<res.size();++i)            cout<<res[i]<<endl;    }    return 0;}//去重vector<int> del(vector<int>& vec){    vector<int> res;    vector<int>::iterator it=vec.begin();    res.push_back(*it);    int itR=0;    while(it!=(vec.end()-1))    {        if(*++it!=res[itR])        {            res.push_back(*it);            itR++;        }           }    return res;}//排序void QuickSort(vector<int>& vec,int low,int high){    int pivot=0;    if (low < high)    {        pivot = Partition(vec,low,high);        QuickSort(vec, low, pivot-1);        QuickSort(vec, pivot+1, high);    }}int Partition(vector<int>& vec, int low, int high){    int pivotkey = vec[low];    while (low < high)    {        while (low < high&&vec[high]>=pivotkey)            high--;        if (low < high)            vec[low++] = vec[high];        while (low < high&&vec[low] <= pivotkey)            low++;        if (low<high)            vec[high--] = vec[low];    }    vec[low] = pivotkey;    return low;}

方法二:

void Solution(int num);int main(){    int count;    while(cin >> count)        Solution(count);    return 0;}void Solution(int num){    vector<int> rnd;    int opt;    for (int i = 0; i < num; ++i)    {        cin >> opt;        rnd.push_back(opt);    }    sort(rnd.begin(),rnd.end());    auto end = unique(rnd.begin(), rnd.end());    rnd.erase(end,rnd.end());    for (int i : rnd)        cout << i << endl;}

4.分割字符串

void Sol(vector<string>& res,string in);int main(){    string input1;    string input2;    getline(cin,input1);    getline(cin,input2);    vector<string> res;    Sol(res,input1);    Sol(res,input2);    for(int i=0;i<res.size();++i)        cout<<res[i]<<endl;}void Sol(vector<string>& res,string in){    if(in.empty())        return;    if(in.size()<=8)    {        for(int i=in.size();i<8;i++)            in+='0';        res.push_back(in);    }    else{        int i=0;        while(i<in.size())        {            string word;            for(int index=0;index<8;index++)            {                if(i+index<in.size())                    word+=in[i+index];                else                    word+='0';            }            res.push_back(word);            i+=8;        }      }      }

5.进制转换

#include<vector>#include<string>#include<algorithm>#include<iostream>#include<sstream>#include<map>using namespace std;map<char,int> mapindex= {    { '0', 0 },    { '1', 1 },    { '2', 2 },    { '3', 3 },    { '4', 4 },    { '5', 5 },    { '6', 6 },    { '7', 7 },    { '8', 8 },    { '9', 9 },    { 'a', 10 },    { 'A', 10 },    { 'b', 11 },    { 'B', 11 },    { 'C', 12 },    { 'c', 12 },    { 'd', 13 },    { 'D', 13 },    { 'E', 14 },    { 'e', 14 },    { 'f', 15 },    { 'F', 15 }};int main(){    string in;    while(cin>>in)    {        string result;        int res=0;        if(in.size()<3)            break;        if(in[0]!='0'||(in[1]!='x'&&in[1]=='X'))           break;        int index=2;        for(;index<in.size();++index)            res=res*16+mapindex[in[index]];        stringstream ss;        ss<<res;        ss>>result;        //注意要加endl,否则就会出错        cout<<result<<endl;       }    return 0;}

6.质数因子

string getResult(long ulDataInput){    long res=ulDataInput;    vector<int> vec;    //此处的循环条件要注意    for(int i=2;i<=res;++i)    {        while(res%i==0)        {            vec.push_back(i);            res/=i;        }    }    stringstream ss;    for(int i=0;i<vec.size();++i)    {        ss<<vec[i]<<' ';    }    return ss.str();}int main(){    long in;    while(cin>>in){        cout<<getResult(in);    }           return 0;   }

7.浮点数:接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。

int main()    {    float in;    while(cin>>in)        {        int res=in;        if((in-res)<0.5)            cout<<res;        else            cout<<res+1;          }    return 0;}

8.合并表记录

int main()    {    int num;    map<int,int> map;    cin>>num;    while(num--)        {        int index,key;        cin>>index>>key;        map[index]+=key;    }    for(auto i:map)        {        cout<<i.first<<" "<<i.second<<endl;    }    return 0;}

9.重复的整数

#include<iostream>#include<vector>#include<algorithm>using namespace std;long long noRepeat(long long in)    {    long long res=0;    vector<int> index;    index.clear();    while(in!=0)        {        int i=in%10;        if(find(index.begin(),index.end(),i)==index.end())            index.push_back(i);        in/=10;    }    for(int i=0;i<index.size();++i)        res=res*10+index[i];    return res;}int main()    {    int in;    cin>>in;    cout<<noRepeat(in)<<endl;    return 0;}

10.字符个数统计

#include<iostream>#include<set>using namespace std;int number(string in)    {    set<char> index;    for(int i=0;i<in.size();++i)        index.insert(in[i]);    return index.size();}int main()    {    string in;    cin>>in;    cout<<number(in);    return 0;}

11.数字颠倒

#include<iostream>#include<vector>#include<sstream>using namespace std;int main()    {    long long in;    while(cin>>in){        vector<int> index;        for(int i=0;i<res.size();++i)        {        index.push_back(in%10);        in/=10;    }    stringstream ss;    for(int i=0;i<index.size();++i)        ss<<index[i];    cout<<ss.str()<<endl;    }    return 0;}

12.字符串的翻转

#include<iostream>#include<string>#include<vector>#include<sstream>using namespace std;int main()    {    string in;    while(cin>>in){        string res;        for(int i=in.size()-1;i>=0;--i)            res+=in[i];        cout<<res;    }    return 0;}

13.翻转字符串的单词

string reverse(string in){    string res;    if(in.empty())        return res;    stringstream ss(in);    string word;    vector<string> vec;    while(ss>>word)        vec.push_back(word);    for(int i=vec.size()-1;i>0;--i)    {        res+=vec[i];        res+=' ';    }    res+=vec[0];    return res;}int main(){    string input;    while (getline(cin, input))    {        cout << reverse(input);    }    return 0;}

14.给定n个字符串,请对n个字符串按照字典序排列。

#include<iostream>#include<string>#include<vector>using namespace std;int Partition(vector<string> &vec,int low,int high)    {    string index=vec[low];    while(low<high)        {        while(low<high&&index<=vec[high])            high--;        if(low<high)            vec[low++]=vec[high];        while(low<high&&index>=vec[low])            low++;        if(low<high)            vec[high--]=vec[low];    }    vec[low]=index;    return low;}void sort(vector<string> &vec,int low,int high){    int index=0;    while(low<high)        {        index=Partition(vec,low,high);        sort(vec,low,index-1);        //快排递归时做一下优化,减少递归时的栈空间        low=index+1;    }}int main(){    int num;    while (cin >> num)    {        vector<string> res;        string tmp;        while (num)        {            cin >> tmp;            res.push_back(tmp);            --num;        }        sort(res,0,res.size()-1);        for(int i=0;i<res.size();++i)            cout<<res[i]<<endl;    }    return 0;}

15.int型中1的个数:

/*输入一个int型数据,计算出该int型数据在内存中存储时1的个数。*/#include<iostream>using namespace std;unsigned Solution(int in){    //循环最高位1所在的位数次    unsigned count=0;    while(in!=0)        {        if(in&1)            count++;        in=in>>1;    }    return count;}int main(){    int num;    while (cin >> num)    {        cout<<Solution(num);    }    return 0;}
unsigned Solution(int in){    //循环int中1个数次    unsigned count=0;    while(in)        {        count++;        in=in&(in-1);    }    return count;}

16.字符串匹配:判断短字符串中的所有字符是否在长字符串中全部出现

#include<string>#include<set>#include<iostream>using namespace std;bool IsAllCharExist(string s1,string s2){    bool flag=true;    int len1=s1.size();    int len2=s2.size();    set<char> index;    for(int i=0;i<len2;++i)        {        index.insert(s2[i]);    }    for(int j=0;j<len1;++j)            {            if(index.find(s1[j])==index.end())               {                flag=false;                 break;            }        }    return flag;}int main()    {    string s1,s2;    while(cin>>s1)    {         cin>>s2;    if(IsAllCharExist(s1,s2))        cout<<"true"<<endl;    else        cout<<"false"<<endl;    }}

17.最长公共子串

这里写图片描述
动态规划:

#include<iostream>#include<vector>#include<string>using namespace std;string maxString(string str1,string str2){    int len1=str1.size();    int len2=str2.size();    vector<int> tmp(len1,0);//存放前一行的结果    vector<int> cur(len1,0);//存放当前行的结果    int maxlen=0;//最长的公共子串长度    int pos=0;//标记最长公共子串最后的位置    for(int i=0;i<len2;i++)    {        //当前行清零        cur.assign(len1,0);        for(int j=0;j<len1;++j)        {            if(str2[i]==str1[j])            {                if(j==0)                    cur[j]=1;                //若匹配,则当前行为前一行j-1位置处值+1;                else                    cur[j]=tmp[j-1]+1;            }            //输出短字符串中最早出现的最长公共子串            if(cur[j]>maxlen)            {                maxlen=cur[j];                pos=j;            }            //最长的长度相同的情况,判断若在短字符串中出现的更早,更新位置标记            else if(maxlen==cur[j]&&j<pos)            {                                    pos=j;            }        }        tmp=cur;    }    string res=str1.substr(pos-maxlen+1,maxlen);    return res;}int main(){    string str1,str2;    while(cin>>str1>>str2)    {               if(str1.size()>str2.size())            cout<<maxString(str2,str1);        else            cout<<maxString(str1,str2);        cout<<endl;    }    return 0;}

解二:

#include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;//找到子串中最长的int findMaxLen(vector<string> vec){    int res=vec[0].size();    for(int i=0;i<vec.size();++i)    {        if(vec[i].size()>res)            res=vec[i].size();    }    return res;}string Find(string s1,string s2){    string res;    //存放所有的子串    vector<string> vec;    int len1=s1.size();    int len2=s2.size();    int i=0,j=0,w=0;    //三个for循环    for(i=0;i<len1;++i)    {               for(j=0;j<len2;++j)        {                       string word="";            int index=i;            for(w=j;w<len2;++w)            {                if(s1[index++]==s2[w])                    word.push_back(s2[w]);                else                    break;            }               if(!word.empty())                vec.push_back(word);        }    }    int max=findMaxLen(vec);    for(int i=0;i<vec.size();++i)    {        if(vec[i].size()==max)        {            res=vec[i];            break;        }    }    return res;}int main(){    string s1,s2;    while(cin>>s1>>s2)        {        if(s1.size()<s2.size())            cout<<Find(s1,s2)<<endl;        else            cout<<Find(s2,s1)<<endl;    }}

18.最小公倍数

#include<iostream>#include<vector>using namespace std;int min(int i,int j)    {    return i>j?j:i;}int minNum(int in1,int in2)    {    int div1=in1;    int div2=in2;    int res=1;    vector<int> vec;    for(int i=2;i<=min(div1,div2);++i)        {        if(div1%i==0&&div2%i==0)            {            vec.push_back(i);            div1/=i;            div2/=i;        }               }    vec.push_back(div1);    vec.push_back(div2);    for(int i=0;i<vec.size();++i)        res*=vec[i];    return res;}int main()    {    int i,j;    while(cin>>i>>j)        {        cout<<minNum(i,j)<<endl;    }}

19.求立方根

#include<iostream>#include<vector>using namespace std;const double DIV=0.0000001;inline double abs(double x){return (x>0?x:-x);}static double getCubeRoot(double input){   // double sum=0;    double res;    //牛顿迭代    for(res=1.0;!(abs(input-res*res*res)<DIV);res=(2*res*res*res+input)/(3*res*res))            ;    return res;}int main()    {    double i;    while(cin>>i)        {        //改变输出的格式        cout << fixed;  //定点十进制        cout.precision(1);  //默认精度值控制为总位数,fixed/scientific/hexfloat之后改变为控制小数点后的位数        cout<<getCubeRoot(i)<<endl;    }}

20.字符逆序

#include<iostream>#include<string>#include<stack>using namespace std;int main()    {    string in;    //注意输入是一行字符串,所以必须要用getline来读取一行输入    while(getline(cin,in))        {        string res;        stack<char> stk;        for(int i=0;i<in.size();++i)            {            stk.push(in[i]);        }        for(int i=0;i<in.size();++i)            {            char ch=stk.top();            res+=ch;            stk.pop();        }        cout<<res<<endl;    }}

21.记负均正II

#include<iostream>#include<vector>using namespace std;int main()    {    vector<int> pos;    vector<int> neg;    int in=0;    double sum=0;    while(cin>>in)        {        if(in>=0)            pos.push_back(in);        else            neg.push_back(in);    }    for(int i=0;i<pos.size();++i)        sum+=pos[i];    cout<<neg.size()<<endl;    double tmp=sum/(pos.size());    cout<<showpoint;//强制显示浮点数的小数点    cout<<tmp<<endl;}

22.Redraiment的走法–最大递增子序列问题;参照30合唱队问题

#include<iostream>#include<vector>using namespace std; int GetResult(int num, int* pInput){    //记录每个节点步数    int *step=new int[num];    //记录最长的结果    int pResult=1;    //初始化每个节点步数数组    for(int i=0;i<num;++i)        step[i]=1;    //动态规划    for(int i=1;i<num;++i)        for(int j=0;j<i;++j)            //若果递增且当前递增序列个数大于已存的值,更新            if(pInput[i]>pInput[j]&&step[j]+1>step[i])            {                step[i]=step[j]+1;                if(step[i]>pResult)                   pResult=step[i];              }    return pResult;}int main()    {    int num;    while(cin>>num)    {        int *in=new int[num];        for(int i=0;i<num;++i)               cin>>in[i];           cout<<GetResult(num,in)<<endl;     }        }

23.字符统计。按字符出现次数从多到少打印,同样次数按大小打印。

//思路:统计最多次出现的字符,从最多次开始打印,每次最多次--,再次遍历map。直到max到0,保证打印完所有的字符。#include<iostream>#include<map>#include<string>using namespace std;void Sol(string in){    map<char,int> index;    //统计最长的字符    int max=0;    for(int i=0;i<in.size();++i)    {        index[in[i]]++;        if(index[in[i]]>max)            max=index[in[i]];    }    while(max)    {        for(map<char,int>::iterator it=index.begin();it!=index.end();it++)        {            if(it->second==max)                cout<<it->first;        }        max--;    }    return;}int main(){    string in;    while(cin>>in)    {        Sol(in);        cout<<endl;    } }

24.输入整型数组和排序标识,对其元素按照升序或降序进行排序

思路:快排做!快排的代码一定要熟悉!!!!!!!

#include<iostream>#include<vector>#include<string>using namespace std;int partition(vector<int>& in,int low,int high,int flag){    int key=in[low];    while(low<high&&flag==0)    {        while(low<high&&in[high]>key)            high--;        if(low<high)            in[low++]=in[high];        while(low<high&&in[low]<key)            low++;        if(low<high)            in[high--]=in[low];    }    while(low<high&&flag==1)    {        while(low<high&&in[high]<key)            high--;        if(low<high)            in[low++]=in[high];        while(low<high&&in[low]>key)            low++;        if(low<high)            in[high--]=in[low];    }    in[low]=key;    return low;}void QuickSort(vector<int>& in,int low,int high,int flag){    if(low>=high) return;    int index=partition(in,low,high,flag);    QuickSort(in,low,index-1,flag);    QuickSort(in,index+1,high,flag);}void sortIntegerArray(vector<int>& in, int flag){    QuickSort(in,0,in.size()-1,flag);}int main(){    int n;    while(cin>>n)    {        vector<int> in;        int w;        for(int i=0;i<n;++i)        {            cin>>w;            in.push_back(w);        }        int flag;        cin>>flag;        sortIntegerArray(in,flag);        for(int i=0;i<in.size()-1;++i)            cout<<in[i]<<" ";        cout<<in[in.size()-1]<<endl;    } }

25.自守数

思路:转换为string,判断短的字符串是否匹配。

#include<iostream>#include<vector>#include<string>using namespace std;//判断是否是自守数bool isT(int in){    int square=in*in;    string s1;    string s2;    //in转换为逆序的string    while(in)    {        s1+=(in%10+'0');        in/=10;    }    //平方数转换为逆序的string    while(square)    {        s2+=(square%10+'0');        square/=10;    }    int i;    //判断逆序后的结果前几位是否相等    for(i=0;i<s1.size();++i)    {        if(s1[i]!=s2[i])            break;    }    if(i==s1.size())        return true;    return false;}int main(){    int n;    while(cin>>n)    {        int count=0;        for(int i=0;i<n;++i)        {            if(isT(i))                count++;        }        cout<<count<<endl;    } }

26.数字前后加上符号“*”

思路:辅助空间字符串来做~

#include<iostream>#include<string>using namespace std;/*输入例子:Jkdi234klowe90a3输出例子:Jkdi*234*klowe*90*a*3**/int main(){    string in;    while(getline(cin,in))    {        string res;        int flag=0;        for(int i=0;i<in.size();i++)        {            if(flag==0&&!isdigit(in[i]))                res+=in[i];            else if(flag==0&&isdigit(in[i]))            {                res+='*';                res+=in[i];                flag=1;            }            else if(flag==1&&isdigit(in[i]))            {                res+=in[i];                flag=1;            }            else if(flag==1&&!isdigit(in[i]))            {                res+='*';                res+=in[i];                flag=0;            }        }        if(isdigit(in[in.size()-1]))            res+='*';        cout<<res<<endl;    }}

27.记票统计

思路:用vector实现输入的人名的先后,用map来做索引操作。

#include<iostream>#include<algorithm>#include<map>#include<vector>#include<string>using namespace std;map<string,int> index;vector<string> vec;int Invalid=0;unsigned int  AddCandidate (string name){    int flag=1;     if(find(vec.begin(),vec.end(),name)==vec.end())        vec.push_back(name);    else        flag=0;    return flag;}void Vote(string name){    if(find(vec.begin(),vec.end(),name)!=vec.end())        index[name]++;    else        Invalid++;}unsigned int  GetVoteResult (string name){    if(find(vec.begin(),vec.end(),name)!=vec.end())        return index[name];    return Invalid;}void Clear(){    index.clear();    vec.clear();    Invalid=0;}int main(){    //候选人个数    int n;    int voteNum;    while(cin>>n)    {        for(int i=0;i<n;++i)        {            string name;            cin>>name;            AddCandidate(name);        }               cin>>voteNum;        for(int i=0;i<voteNum;++i)        {            string name;            cin>>name;            Vote(name);        }        for(int i=0;i<vec.size();++i)            cout<<vec[i]<<" : "<<GetVoteResult(vec[i])<<endl;        cout<<"Invalid : "<<Invalid<<endl;        Clear();    }}

28.在字符串中找出连续最长的数字串

思路:注意考虑最后若为连续数字串的处理。

#include<iostream>#include<algorithm>#include<map>#include<vector>#include<string>using namespace std;int main(){    string in;    while(cin>>in)    {        vector<string> vec;        int flag=0;        string tmp;        for(int i=0;i<in.size();++i)        {            if(flag==0&&isdigit(in[i]))            {                tmp+=in[i];                flag=1;            }            else if(flag==1&&isdigit(in[i]))            {                tmp+=in[i];                if(i==in.size()-1)                    vec.push_back(tmp);            }            else if(flag==1&&!isdigit(in[i]))            {                vec.push_back(tmp);                tmp.clear();                flag=0;            }        }        int max=0;        for(int i=0;i<vec.size();++i)        {            if(vec[i].size()>max)                max=vec[i].size();        }        for(int i=0;i<vec.size();++i)        {            if(vec[i].size()==max)                cout<<vec[i];        }        cout<<","<<max<<endl;    }}

29.合法IP

思路:ip考虑是否为四个字符串,字符串转int后,必须小于255。且IP地址中除了数字和.不能有其他的字符。

#include<iostream>#include<algorithm>#include<sstream>#include<vector>#include<string>using namespace std;int main(){    string in;    while(cin>>in)    {        vector<string> vec;        string res="YES";        string tmp;        for(int i=0;i<in.size();i++)        {            if(!(isdigit(in[i])||in[i]=='.'))                res="NO";        }        for(int i=0;i<in.size();i++)        {            if(isdigit(in[i]))            {                tmp+=in[i];                if(i==in.size()-1)                    vec.push_back(tmp);;            }            else if(in[i]=='.')            {                vec.push_back(tmp);                tmp.clear();            }               }        if(vec.size()!=4)            res="NO";        for(int i=0;i<vec.size();i++)        {            stringstream ss;            ss<<vec[i];            int num;            ss>>num;            if(num>255)            {                res="NO";                break;            }        }        cout<<res<<endl;    }}

30.合唱队问题

思路:动态规划;
两次遍历,第一次找从头到尾最长递增子序列,第二次从尾到头找最长递增子序列。
i位置两个序列数组中和最大,则要踢出去的人数最少。最少人数为in+1-max;

#include<iostream>#include<algorithm>#include<sstream>#include<vector>#include<string>using namespace std;int main(){    int in;    while(cin>>in)    {        vector<int> vec;        for(int i=0;i<in;i++)        {            int tmp;            cin>>tmp;            vec.push_back(tmp);        }        vector<int> res1(in,1);        vector<int> res2(in,1);        for(int i=1;i<in;i++)            for(int j=0;j<i;++j)                if(vec[i]>vec[j]&&res1[j]+1>res1[i])                    res1[i]=res1[j]+1;        for(int i=in-2;i>=0;i--)            for(int j=in-1;j>i;--j)                if(vec[i]>vec[j]&&res2[j]+1>res2[i])                    res2[i]=res2[j]+1;        int max=-1;        for(int i=0;i<vec.size();i++)        {            int sum=res1[i]+res2[i];            if(sum>max)                max=sum;        }        cout<<in+1-max<<endl;           } }

31.将真分数分解为埃及分数(贪心算法)

具体步骤参见:http://blog.csdn.net/hnust_xiehonghao/article/details/8682673

a、b为互质正整数,a<b 分数a/b 可用以下的步骤分解成若干个单位分数之和:步骤一: 用b 除以a,得商数q1 及余数r1。`(r1=b - a*q1)`步骤二:把a/b 记作:`a/b=1/(q1+1)+(a-r)/b(q1+1`步骤三:重复步骤2,直到分解完毕3/7=1/3+2/21=1/3+1/11+1/23113/23=1/2+3/46=1/2+1/16+1/368以上其实是数学家斐波那契提出的一种求解埃及分数的贪心算法,准确的算法表述应该是这样的:设某个真分数的分子为a,分母为b;把b除以a的商部分加1后的值作为埃及分数的某一个分母c;将a乘以c再减去b,作为新的a;将b乘以c,得到新的b;如果a大于1且能整除b,则最后一个分母为b/a;算法结束;或者,如果a等于1,则,最后一个分母为b;算法结束;否则重复上面的步骤。

牛客的测试用例有问题,思想对了就行了。答案不唯一。

#include<iostream>#include<algorithm>#include<sstream>#include<vector>#include<string>using namespace std;string toS(int i){    stringstream ss;    ss<<i;    string res;    ss>>res;    return res;}int toI(string i){    stringstream ss;    ss<<i;    int res;    ss>>res;    return res;}string Sol(string in){    string s1,s2;    int flag=0;    for(int i=0;i<in.size();i++)    {        if(flag==0&&in[i]!='/')            s1+=in[i];        else if(flag==0&&in[i]=='/')            flag=1;        else if(flag==1)            s2+=in[i];    }    int a=toI(s1);    int b=toI(s2);    vector<string> vec;    int q1,r1;    while(b%a!=0)    {        q1=b/a;        r1=b%a;        a=a-r1;        b=b*(q1+1);        string tmp;        tmp="1/"+toS(q1+1);        vec.push_back(tmp);    }    string tmp;    tmp="1/"+toS(b/a);    vec.push_back(tmp);     string res;    for(int i=0;i<vec.size()-1;++i)        res+=vec[i]+'+';    res+=vec[vec.size()-1];    return res;}int main(){    string in;    while(cin>>in)    {         cout<<Sol(in)<<endl;    }}

32.不区分大小写,求最长公共子串。

思路:对判断两个字符是否相等重新定义函数来做。

#include<vector>#include<string>#include<algorithm>#include<iostream>#include<sstream>#include<map>using namespace std;bool isEqual(char i,char j){    if(i==j||isupper(i)==j)        return true;    return false;       }int maxString(string str1,string str2){    int len1=str1.size();    int len2=str2.size();    int maxlen=0;    vector<int> tmp(len1,0);    vector<int> cur(len1,0);    for(int i=0;i<len2;++i)    {        cur.assign(len1,0);        for(int j=0;j<len1;++j)        {            if(isEqual(str1[j],str2[i]))            {                if(j==0)                    cur[j]=1;                else                    cur[j]=tmp[j-1]+1;            }            if(cur[j]>maxlen)                maxlen=cur[j];        }        tmp.assign(cur.begin(),cur.end());    }    return maxlen;}int main(){    string in1,in2;    while(cin>>in1>>in2)    {        cout<<maxString(in1,in2)<<endl;    }}

33.字符串的编辑距离问题–计算字符串的相似度

思路:动态规划问题。类似于求最长公共子序列问题。
这里写图片描述

#include<vector>#include<string>#include<algorithm>#include<iostream>#include<sstream>#include<map>using namespace std;int min(int a,int b,int c){    int res=a;    if(b<res)        res=b;    if(c<res)        res=c;    return res;}string toS(int i){    stringstream ss;    ss<<i;    string res;    ss>>res;    res="1/"+res;    return res;}string disString(string str1,string str2){    int len1=str1.size();    int len2=str2.size();    vector<vector<int>> arr;    for(int i=0;i<len1+1;++i)    {        vector<int> tmp;        for(int j=0;j<len2+1;++j)        {            tmp.push_back(0);        }        arr.push_back(tmp);    }    for(int i=0;i<len1+1;++i)    {        arr[i][0]=i;    }    for(int i=0;i<len2+1;++i)    {        arr[0][i]=i;    }    for(int i=1;i<len1+1;++i)    {        for(int j=1;j<len2+1;++j)        {            if(str1[i-1]==str2[j-1])                arr[i][j]=min(arr[i-1][j-1],arr[i-1][j]+1,arr[i][j-1]+1);            else                arr[i][j]=min(arr[i-1][j-1]+1,arr[i-1][j]+1,arr[i][j-1]+1);        }    }    return toS(arr[len1][len2]+1);}int main(){    string in1,in2;    while(cin>>in1>>in2){        cout<<disString(in1,in2)<<endl;    }}

34.火车进站问题

这里写图片描述

#include<iostream>#include<vector>#include<stack>#include<algorithm>#include<sstream>using namespace std;void Sol(vector<int> in,stack<int> sk,vector<int> vec,int index,vector<vector<int>>& RES){    for(int i=sk.size();i>=0;--i)    {        stack<int> stmp(sk);        vector<int> vtmp(vec);        for(int j=1;j<=i;++j)        {            int tmp=stmp.top();            stmp.pop();            vtmp.push_back(tmp);        }        stmp.push(in[index]);        if(in.size()-1==index)        {            vector<int> res(vtmp);            while(!stmp.empty())            {                res.push_back(stmp.top());                stmp.pop();            }            RES.push_back(res);        }        else            Sol(in,stmp,vtmp,index+1,RES);    }   }vector<int> toI(string in){    vector<int> res;    for(int i=0;i<in.size();++i)    {        stringstream ss;        ss<<in[i];        int tmp;        ss>>tmp;        res.push_back(tmp);     }    return res;}string toS(vector<int> vec){    string res;    for(int i=0;i<vec.size();++i)    {        stringstream ss;        ss<<vec[i];        string tmp;        ss>>tmp;        res+=tmp;       }    return res;}vector<vector<int>> handle(vector<vector<int>> in){    vector<vector<int>> res;    vector<string> res1;    for(int i=0;i<in.size();++i)    {        string tmp=toS(in[i]);        res1.push_back(tmp);    }    sort(res1.begin(),res1.end());    for(int i=0;i<res1.size();++i)    {        vector<int> tmp=toI(res1[i]);        res.push_back(tmp);    }    return res;}int main(){      int n;      while(cin>>n)      {          vector<int> in;          stack<int> sk;          vector<int> vec;          vector<vector<int>> RES;          for(int i=0;i<n;i++)          {              int tmp;              cin>>tmp;              in.push_back(tmp);          }          Sol(in,sk,vec,0,RES);          RES=handle(RES);          for(int i=0;i<RES.size();i++)          {              for(int j=0;j<RES[i].size();j++)                  {                 if(j==RES[i].size()-1)                     cout<<RES[i][j];                  else                      cout<<RES[i][j]<<" ";              }                     cout<<endl;          }      }}
2 1