华为机试--牛客刷题

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<return 0;
}
int main()
    {
    string input;
    while(getline(cin,input))
        {
        stringstream ss(input);
        string word;
        while(ss>>word)
            ;
        cout<size();
    }
    return 0;
}

2.计算字符串个数

int main()
{
    string input;  
    getline(cin,input);
    map<char,int> index;
    char ch;
    cin>>ch;
    for(int i=0;iint res=index[toupper(ch)]+index[tolower(ch)];  
    cout<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::iterator it=unique(vec.begin(),vec.end());
        //vec.erase(it,vec.end());
        for(int i=0;icout<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 (lowreturn 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;icout<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(istring word;
            for(int index=0;index<8;index++)
            {
                if(i+indexelse
                    word+='0';
            }
            res.push_back(word);
            i+=8;
        }  
    }      
}

5.进制转换

#include
#include
#include
#include
#include
#include
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(;index16+mapindex[in[index]];

        stringstream ss;
        ss<>result;
        //注意要加endl,否则就会出错
        cout<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' ';
    }
    return ss.str();
}
int main(){
    long in;
    while(cin>>in){
        cout<return 0;   
}

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

int main()
    {
    float in;
    while(cin>>in)
        {
        int res=in;
        if((in-res)<0.5)
            cout<else
            cout<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<" "<return 0;
}

9.重复的整数

#include
#include
#include
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;i10+index[i];
    return res;
}
int main()
    {
    int in;
    cin>>in;
    cout<return 0;
}

10.字符个数统计

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

11.数字颠倒

#include
#include
#include
using namespace std;
int main()
    {
    long long in;
    while(cin>>in){

        vector<int> index;
        for(int i=0;i10);
        in/=10;
    }
    stringstream ss;
    for(int i=0;icout<return 0;
}

12.字符串的翻转

#include
#include
#include
#include
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<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
#include
#include
using namespace std;
int Partition(vector<string> &vec,int low,int high)
    {
    string index=vec[low];
    while(lowwhile(lowif(lowwhile(low=vec[low])
            low++;
        if(lowreturn low;
}

void sort(vector<string> &vec,int low,int high)
{
    int index=0;
    while(low1);
        //快排递归时做一下优化,减少递归时的栈空间
        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;icout<return 0;
}

15.int型中1的个数:

/*
输入一个int型数据,计算出该int型数据在内存中存储时1的个数。
*/
#include
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<return 0;
}
unsigned Solution(int in)
{
    //循环int中1个数次
    unsigned count=0;
    while(in)
        {
        count++;
        in=in&(in-1);
    }
    return count;
}

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

#include
#include
#include
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;ifor(int j=0;jif(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"<else
        cout<<"false"<

17.最长公共子串

华为机试--牛客刷题_第1张图片
动态规划:

#include
#include
#include
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//当前行清零
        cur.assign(len1,0);
        for(int j=0;jif(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]&&jstring res=str1.substr(pos-maxlen+1,maxlen);
    return res;
}
int main()
{
    string str1,str2;
    while(cin>>str1>>str2)
    {       
        if(str1.size()>str2.size())
            cout<else
            cout<cout<return 0;
}

解二:

#include
#include
#include
#include
using namespace std;

//找到子串中最长的
int findMaxLen(vector<string> vec)
{
    int res=vec[0].size();
    for(int i=0;iif(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;ifor(j=0;jstring word="";
            int index=i;
            for(w=j;wif(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;iif(vec[i].size()==max)
        {
            res=vec[i];
            break;
        }
    }
    return res;
}
int main()
{
    string s1,s2;
    while(cin>>s1>>s2)
        {
        if(s1.size()cout<else
            cout<

18.最小公倍数

#include
#include
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;ireturn res;
}
int main()
    {
    int i,j;
    while(cin>>i>>j)
        {
        cout<

19.求立方根

#include
#include
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)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<

20.字符逆序

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

21.记负均正II

#include
#include

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;icout<double tmp=sum/(pos.size());
    cout<//强制显示浮点数的小数点
    cout<

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

#include
#include
using namespace std; 
int GetResult(int num, int* pInput)
{
    //记录每个节点步数
    int *step=new int[num];
    //记录最长的结果
    int pResult=1;
    //初始化每个节点步数数组
    for(int i=0;istep[i]=1;

    //动态规划
    for(int i=1;ifor(int j=0;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>in[i];   
        cout<in)<

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

//思路:统计最多次出现的字符,从最多次开始打印,每次最多次--,再次遍历map。直到max到0,保证打印完所有的字符。
#include
#include
#include
using namespace std;
void Sol(string in)
{
    map<char,int> index;
    //统计最长的字符
    int max=0;
    for(int i=0;iif(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<first;
        }
        max--;
    }
    return;
}
int main()
{
    string in;
    while(cin>>in)
    {
        Sol(in);
        cout<

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

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

#include
#include
#include
using namespace std;
int partition(vector<int>& in,int low,int high,int flag)
{
    int key=in[low];
    while(low0)
    {
        while(lowkey)
            high--;
        if(lowwhile(lowif(lowwhile(low1)
    {
        while(lowif(lowwhile(lowkey)
            low++;
        if(lowreturn 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;icin>>w;
            in.push_back(w);
        }
        int flag;
        cin>>flag;

        sortIntegerArray(in,flag);
        for(int i=0;i1;++i)
            cout<" ";
        cout<1]<

25.自守数

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

#include
#include
#include
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;iif(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;iif(isT(i))
                count++;
        }
        cout<

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

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

#include
#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<

27.记票统计

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

#include
#include
#include
#include
#include
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;istring name;
            cin>>name;
            AddCandidate(name);
        }       
        cin>>voteNum;
        for(int i=0;istring name;
            cin>>name;
            Vote(name);
        }
        for(int i=0;icout<" : "<cout<<"Invalid : "<

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

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

#include
#include
#include
#include
#include
using namespace std;

int main()
{
    string in;
    while(cin>>in)
    {
        vector<string> vec;
        int flag=0;
        string tmp;
        for(int i=0;iif(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;iif(vec[i].size()>max)
                max=vec[i].size();
        }
        for(int i=0;iif(vec[i].size()==max)
                cout<cout<<","<

29.合法IP

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

#include
#include
#include
#include
#include
using namespace std;

int main()
{
    string in;
    while(cin>>in)
    {
        vector<string> vec;
        string res="YES";
        string tmp;
        for(int i=0;iif(!(isdigit(in[i])||in[i]=='.'))
                res="NO";
        }
        for(int i=0;iif(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;istringstream ss;
            ss<int num;
            ss>>num;
            if(num>255)
            {
                res="NO";
                break;
            }
        }
        cout<

30.合唱队问题

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

#include
#include
#include
#include
#include
using namespace std;

int main()
{
    int in;
    while(cin>>in)
    {
        vector<int> vec;
        for(int i=0;iint tmp;
            cin>>tmp;
            vec.push_back(tmp);
        }
        vector<int> res1(in,1);
        vector<int> res2(in,1);

        for(int i=1;ifor(int j=0;jif(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;iint sum=res1[i]+res2[i];
            if(sum>max)
                max=sum;
        }
        cout<1-max<

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

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

a、b为互质正整数,aa/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/231
13/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
#include
#include
#include
#include
using namespace std;

string toS(int i)
{
    stringstream ss;
    ss<string res;
    ss>>res;
    return res;
}

int toI(string i)
{
    stringstream ss;
    ss<int res;
    ss>>res;
    return res;
}

string Sol(string in)
{
    string s1,s2;
    int flag=0;
    for(int i=0;iif(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;i1;++i)
        res+=vec[i]+'+';
    res+=vec[vec.size()-1];
    return res;
}
int main()
{
    string in;
    while(cin>>in)
    { 
        cout<

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

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

#include
#include
#include
#include
#include
#include
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;i0);
        for(int j=0;jif(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<

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

思路:动态规划问题。类似于求最长公共子序列问题。
华为机试--牛客刷题_第2张图片

#include
#include
#include
#include
#include
#include
using namespace std;

int min(int a,int b,int c)
{
    int res=a;
    if(bif(creturn res;
}
string toS(int i)
{
    stringstream ss;
    ss<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;i1;++i)
    {
        vector<int> tmp;
        for(int j=0;j1;++j)
        {
            tmp.push_back(0);
        }
        arr.push_back(tmp);
    }

    for(int i=0;i1;++i)
    {
        arr[i][0]=i;
    }
    for(int i=0;i1;++i)
    {
        arr[0][i]=i;
    }

    for(int i=1;i1;++i)
    {
        for(int j=1;j1;++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<

34.火车进站问题

这里写图片描述

#include
#include
#include
#include
#include
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;istringstream ss;
        ss<int tmp;
        ss>>tmp;
        res.push_back(tmp); 
    }
    return res;
}
string toS(vector<int> vec)
{
    string res;
    for(int i=0;istringstream ss;
        ss<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;istring tmp=toS(in[i]);
        res1.push_back(tmp);
    }
    sort(res1.begin(),res1.end());
    for(int i=0;ivector<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;iint tmp;
              cin>>tmp;
              in.push_back(tmp);
          }
          Sol(in,sk,vec,0,RES);

          RES=handle(RES);

          for(int i=0;ifor(int j=0;jif(j==RES[i].size()-1)
                     cout<else
                      cout<" ";
              }       
              cout<

你可能感兴趣的:(练手程序)