zoukankan      html  css  js  c++  java
  • 北京理工大学复试上机--2018

    1、输入一个只含有英文字母的字符串,输出最大回文子串的长度及此长度回文子串的个数(回文不区分大小写)。
    样例:
    输入: aBaAb (最大回文子串为BaAb)
    输出: 4 1
    输入: aBcbBb (最大回文子串为Bcb和bBb)
    输出: 3 2

    输入: a B
    输出: 1 2
    输入: aBcbB
    输出: 3 1
    输入: aaaaaa
    输出: 6 1

    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    
    bool isHw(string s) {
        int i, l;
        l = s.length();
        for (int i = 0; i < l / 2; i++) {
            if (toupper(s[i]) != toupper(s[l - i - 1])) return false;
        }
        return true;
    }
    
    int main() {
        string s;
        while (getline(cin, s)) {
            int i, j, maxl, num = 0;
            map<int, int> m;
            map<string, int> ms;//防止相同的回文串重复计数,按题目意思应该是统计同一长度不同的串
            maxl = 0;
            for (i = 0; i < s.length(); i++) {
                if(!isalpha(s[i])) continue;
                string str;
                for (j = i; j < s.length(); j++) {
                    if(!isalpha(s[j])) {
                        str = "";
                        continue;
                    }
                    str += s[j]; 
                    if (isHw(str) && ms[str] == 0) {
                        ms[str]++;
                        if (str.length() > maxl) maxl = str.length();
                        m[str.length()]++;
                    }
                }
            }
            if(maxl != 0) cout << maxl << " " << m[maxl] << endl;
        }
        return 0;
    }
    

    2、哥德巴赫猜想
    任何一个大于2的偶数均可表示为两个素数之和。输入m, n(6<=m<=n<=50),则把[m, n]内的所有偶数表示成两个素数之和的形式。输出这些素数及其出线的次数,输出次序按照素数出现的次数从多到少输出;若出线次数相同,按照素数从大到小输出;若偶数有多种素数相加形式,则把所有的情况都输出,每种情况占一行。

    输入:
    8 9
    输出:
    5 1 3 1

    输入:
    9 10
    输出:
    5 2
    7 1 3 1

    输入:
    14 15
    输出:
    11 1 3 1
    7 2

    输入:
    8 10
    输出:
    3 2 7 1 5 1
    5 3 3 1

    #include <iostream>
    #include <map>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    vector<int> v;
    map<int, int> mmp;
    
    bool cmp(int a, int b) {
        if(mmp[a] == mmp[b]) return a > b;
        return mmp[a] > mmp[b];
    }
    
    bool isPrime(int n) {
        if(n == 1) return false;
        for(int i = 2; i <= n / 2; i++) {
            if(n % i == 0) return false;
        }
        return true;
    }
    
    void dfsPrime(int m, int n) {
        if(m >= n && !v.empty()) {
            sort(v.begin(), v.end(), cmp);
            map<int, int> op;
            for(int i = 0; i < v.size(); i++) {
                op[v[i]]++;
                if(op[v[i]] == 1 && mmp[v[i]] != 0) cout << v[i] << " " << mmp[v[i]] << " ";
            }
            cout << endl;
            return ;
        }
        else {
            if(m % 2 != 0) m++;
            for(int j = 2; j <= m / 2; j++) {
                if(isPrime(j) && isPrime(m - j)) {
                    v.push_back(j);
                    v.push_back(m - j);
                    mmp[j]++;
                    mmp[m - j]++;
                    dfsPrime(m + 1, n);
                    v.pop_back();
                    v.pop_back();
                    mmp[j]--;
                    mmp[m- j]--;
                }
            }
        }
    }
    
    int main() {
        int m, n;
        while(cin >> m >> n) {
            dfsPrime(m, n);
        }
        return 0;
    }
    

    PS: 第二题当前用例正常,比如10 16 就会异常,目前没Debug出来,回头在更新, mark!

  • 相关阅读:
    力扣(LeetCode)验证回文字符串II 个人题解
    力扣(LeetCode)寻找数组的中心索引 个人题解
    力扣(LeetCode)验证回文串 个人题解
    力扣(LeetCode)三个数的最大乘积 个人题解
    力扣(LeetCode)二进制求和 个人题解
    力扣(LeetCode)加一 个人题解
    力扣(LeetCode)整数反转 个人题解
    力扣(LeetCode)颠倒二进制位 个人题解
    力扣(LeetCode)最后一个单词的长度 个人题解
    力扣(LeetCode)学生出勤记录I 个人题解
  • 原文地址:https://www.cnblogs.com/ache/p/12630050.html
Copyright © 2011-2022 走看看