• 牛客网-华为-2020届校园招聘上机考试-软件类机考-2


    题目描述:
    输入一个字符串(不含空格), 请寻找输入中包含所有蛇形字符串。
    蛇形字符串定义:
    1.蛇形字符串由连续字符对组成,其特点如下:
    1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小)。如:Aa,Dd;
    1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如:AaBbCc或OoPpQqRrSs;
    2.从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:
    2.1 每次寻找必须是最长的蛇形字符串;
    2.2 使用过的字符不能重复使用;

    例: 输入SxxsrR^AaSs
    正确过程:
    Step1:SxxsrR^AaSs -> RrSs (找到两对连续字符对:Ss、Rr,可以组成蛇形字符串。另,Ss后应该是Tt,但当前字符串SxxsrR^AaSs中不包含,所以当前蛇形字符串到Ss结束。本轮查找结果是RrSs。)
    Step2:xs^AaSs -> Aa
    Step3:xx^Ss -> Ss

    ……(省略其他错误说明)

    输入描述:
    一个字符串(不含空格,字符串长度<=5000)
    输出描述:

    1. 所有包含的蛇形字符串,按首字母升序排列(即A在Z前);(这里和前面2.1中“每次寻找必须是最长的蛇形字符串”冲突!)
    2. 同一个首字母的情况,按照蛇形字符串长度升序输出;
    3. 如果没有找到,输出Not Found。

    示例1:
    输入:SwSE$3454356DD$$E#eswsxxsssAAWDxxdderfvcRFER65645hbg^%%UnbnvccTRChnyvcxcvVCFR
    输出:
    (下面这个输出是题目给出的,但事实上和上面说的矛盾,是错误的!)
    (这里我先按照上面的编写了很久,结果用这个案例自测一直错误;后来改成能输出下面结果的代码,即不管长度按照首字母顺序输出,这能够通过自测,提交之后能够通过60%的案列;然后很暴躁地重读题目,发现这个bug,就修改回原先的方法,并优化了代码,这才通过所有测试案例……因为这么小的系统bug,真的是耗神又耗时啊……)
    CcDdEeFf
    CcDdEe
    RrSs
    Ss
    VvWw
    (下面这个输出才是符合前面所说,是正确的)
    CcDdEeFf
    CcDdEe
    RrSs
    VvWw
    Ss

    1.思考

    • 首先想到利用ASCII码来简化操作,这样所有的记录都可以用“a”+数字进行;
    • 先定义一个26长度的vector <int> mp来计数Aa这样的有几个,每次找到并计数,再从str中删除;
    • 然后调用自己编写的FindS()函数,来找到最长的蛇形字符串,用res来记录字符串开始和结束的位置,最后输出,输出的时候要在mp计数的对应位置-1;
    • 如果存在蛇形字符串,则反复调用FindS()函数,直到所有蛇形字符串都输出;
    • 如果FindS()函数没有找到蛇形字符串,则输出Not Found。

    2.实现

    • 这里一方面也因为自己太急躁没有完全读清楚题意,另一方面因为自己被之前不知名的Bug折腾的没有底,再加之时间一点点耗尽,所以耗费时间超级长;
    • 进度差不多是这样的:半小时左右完成代码编写,之后40min左右一直在dubug。导致最后完成这道题之后只剩下20min左右了……
    • 遇事一定不能慌!心态还是不行,有待提升!
    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    bool FindS(vector<char>& str, vector<int>& mp)
    {
    	int count = 0, mxs = 0, i = 0, j = 0;
    	vector<int> range(2);
    	bool flag = false;
    	while (i < 26){
    		if (mp[i]>0){
    			count = 1;
    			j = i + 1;
    			while (j < 26 && mp[j]>0){
    				count++;
    				j++;
    			}
    			if (count > mxs){
    				flag = true;
    				mxs = count;
    				range[0] = i;
    				range[1] = j - 1;
    			}
    			i = j + 1;
    		}
    		else{
    			i++;
    		}
    	}
    
    	if (flag == false)
    		return false;
    
    	vector<char> res;
    	for (int i = range[0]; i <= range[1]; i++){
    		res.push_back('A' + i);
    		res.push_back('a' + i);
    		mp[i]--;
    	}
    
    	int lres = res.size();
    	for (int i = 0; i < lres; i++){
    		if (i < lres - 1){
    			cout << res[i];
    		}
    		else{
    			cout << res[i] << endl;
    		}
    	}
    
    	return true;
    }
    
    int main(){
    	string input;
    	vector<char> str;
    
    	while (getline(cin, input)){
    		str.clear();
    		vector<int> mp(26, 0);
    
    		for (auto in : input){
    			str.push_back(in);
    		}
    
    		/* //So complicated
    		int posa, posA;
    		for (int i = 0; i < 26; i++){
    			auto pA = find(str.begin(), str.end(), 'A' + i);
    			auto pa = find(str.begin(), str.end(), 'a' + i);
    			while (pa != str.end() && pA != str.end()){
    				posa = pa - str.begin();
    				posA = pA - str.begin();
    				str.erase(str.begin() + max(posa, posA));
    				str.erase(str.begin() + min(posa, posA));
    				mp[i]++;
    				pA = find(str.begin(), str.end(), 'A' + i);
    				pa = find(str.begin(), str.end(), 'a' + i);
    			}
    		}*/
    
    		//Optimize mp
    		int len = str.size(), ai, Ai;
    		vector<int> ma(26, 0), mA(26, 0);
    		for (int i = 0; i < len; i++){
    			ai = str[i] - 'a';
    			if (ai >= 0 && ai < 26){
    				ma[ai]++;
    				continue;
    			}
    			Ai = str[i] - 'A';
    			if (Ai >= 0 && Ai < 26){
    				mA[Ai]++;
    			}
    		}
    
    		for (int i = 0; i < 26; i++){
    			mp[i] = min(ma[i], mA[i]);
    		}
    
    		//FindSnake
    		bool flag = false;
    		while (1){
    			if (FindS(str, mp) == false){
    				break;
    			}
    			else{
    				flag = true;
    			}
    		}	
    
    		if (flag == false){
    			cout << "Not Found" << endl;
    		}
    
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    pytest框架运用
    unitTest学习
    发送邮件
    python 连接远程服务器,修改时间
    Redis基础
    django 知识点扩展
    ACM 题目 1487: [蓝桥杯][算法提高VIP]不同单词个数统计
    Leetcode 面试题 08.01. 三步问题
    Leetocode 198. 打家劫舍
    Leetcode 121. 买卖股票的最佳时机
  • 原文地址:https://www.cnblogs.com/xuyy-isee/p/10568135.html
Copyright © 2020-2023  润新知