華爲機試--牛客刷題

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/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<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;
          }
      }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章