华为社招机考考什么_牛客网-华为-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)

输出描述:

所有包含的蛇形字符串,按首字母升序排列(即A在Z前);(这里和前面2.1中“每次寻找必须是最长的蛇形字符串”冲突!)

同一个首字母的情况,按照蛇形字符串长度升序输出;

如果没有找到,输出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 mp来计数Aa这样的有几个,每次找到并计数,再从str中删除;

然后调用自己编写的FindS()函数,来找到最长的蛇形字符串,用res来记录字符串开始和结束的位置,最后输出,输出的时候要在mp计数的对应位置-1;

如果存在蛇形字符串,则反复调用FindS()函数,直到所有蛇形字符串都输出;

如果FindS()函数没有找到蛇形字符串,则输出Not Found。

2.实现

这里一方面也因为自己太急躁没有完全读清楚题意,另一方面因为自己被之前不知名的Bug折腾的没有底,再加之时间一点点耗尽,所以耗费时间超级长;

进度差不多是这样的:半小时左右完成代码编写,之后40min左右一直在dubug。导致最后完成这道题之后只剩下20min左右了……

遇事一定不能慌!心态还是不行,有待提升!

#include

#include

#include

#include

using namespace std;

bool FindS(vector& str, vector& mp)

{

int count = 0, mxs = 0, i = 0, j = 0;

vector 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 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 str;

while (getline(cin, input)){

str.clear();

vector 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 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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值