• 腾讯面试题1


    给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
    输出需要删除的字符个数。

    转:http://www.nowcoder.com/profile/384632/codeBookDetail?submissionId=3047324

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    int LCS(string&str1,string&str2);
    int main()
    {
        string str;
        while(cin>>str)
        {
            string temp(str.rbegin(),str.rend());
            cout<<str.size()-LCS(str,temp)<<endl;
        }
        return 0;
    }
    int LCS(string&str1,string&str2)
    {
        int len1=str1.size();
        int len2=str2.size();
        vector<vector<int>> res(len1+1,vector<int>(len2+1,0));
        for(int i=1;i<=len1;i++)
            for(int j=1;j<=len2;j++)
            {
                if(str1[i-1]==str2[j-1])
                    res[i][j]=res[i-1][j-1]+1;
                else
                    res[i][j]=max(res[i][j-1],res[i-1][j]);
            
            }
        return res[len1][len2];
    }

    小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
    你能帮帮小Q吗?

    输入描述:

    输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.


    输出描述:

    对于每组数据,输出移位后的字符串。

    输入例子:
    AkleBiCeilD
    
    输出例子:
    kleieilABCD


    #include<string>
    #include<iostream>
    using namespace std;
    int main()
    {
        string str;
        while(cin>>str)
        {
            int len=str.size();
            int newsize=len;
            for(int i=0;i<newsize;i++)
            {
                if(str[i]>='A'&&str[i]<='Z')
                {
                    char temp=str[i];
                    for(int j=i;j<len;j++)
                        str[j]=str[j+1];
                    str[len-1]=temp;
                    newsize--;
                    i--;
                }
            }
            cout<<str<<endl;
        }
        return 0;
    }

    小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

    输入描述:

    输入包含多组测试数据。
    对于每组测试数据:
    N - 本组测试数据有n个数
    a1,a2...an - 需要计算的数据
    保证:
    1<=N<=100000,0<=ai<=INT_MAX.


    输出描述:

    对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。

    输入例子:
    6
    45 12 45 32 5 6
    
    输出例子:
    1 2
    
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    int main()
    {
        int N;
        while(cin>>N)
        {
            vector<int> array(N);
            for(int i=0;i<N;i++)
                cin>>array[i]; 
            if(N==1)
            {
               cout<<0<<" "<<0<<endl;
               continue; 
            }
            sort(array.begin(),array.end());
            if(array[0]==array[N-1])
            {
                int num=N*(N-1)/2;
                cout<<num<<" "<<num<<endl;
                continue;
            }
            int maxNum=count(array.begin(),array.end(),array[N-1]);
            int minNum=count(array.begin(),array.end(),array[0]);
            int max=maxNum*minNum;
            int minValue=array[1]-array[0];
            for(int i=1;i<N;i++)
                if(array[i]-array[i-1]<minValue)
                    minValue=array[i]-array[i-1];
            int min=0;
            for(int i=1;i<N;i++)
                for(int j=i-1;j>=0;j--)
                    if(array[i]-array[j]==minValue)
                        min++;
                    else
                        break;    //这一步相当关键啊
            cout<<min<<" "<<max<<endl;
            }
        return 0;
    }
  • 相关阅读:
    Arduino系列之智能家居蓝牙语音遥控灯(四)
    Arduino系列之光照传感器(三)
    address2line 定位 Android c++奔溃位置
    android UI线程安全问题
    android 后台服务定时通知
    eclipse 完全智能提示
    IOS 7 Xcode 5 免IDP证书 真机调试(转载)
    DS5 调试 android c++
    javap -s 查看java方法签名
    ndk-stack 调试 android c++ 代码崩溃位置
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/5548981.html
Copyright © 2020-2023  润新知