字符串展开
输入一个字符串,包含四种类型的字符,大写字母,小写字母,数字,减号(-)
要求:
1. 对输入的字符串做相应的展开并且输出,如a-d展开为abcd,A-C展开为ABC,4-4展开成4
2. 如果前后不是一种类型的字符,按照小写-大写-数字-小写的顺序循环展开,例如a-A展开为abcd...xyzA,0-A展开为0123...9abc..xyzA
3. 如果前后是同种类型的字符,但是顺序相反,比如9-8,输出空
样例输入:“1-4x-Ad-d”
样例输出:"1234xyzAd"
本题的关键点在于 按照小写-大写-数字-小写的顺序循环展开 最直接的思路就是分类展开,3*3九种情况,例如“start-end”其中当start、end为同类(小写、大写、数字)时可以归为同一种情况。另外则有3*2=6种情况。
附上个人代码:
string fun(string s){
if(s==" ")return " ";
int len=s.length(),i=0,start,end;
string res="";
char c;
while(i<len){
while(s[i]!='-')i++;
start=i-1;
end=i+1;
if((s[start]>='0'&&s[end]<='9')||
(s[start]>='a'&&s[end]>='a'&&s[end]<='z')||
(s[start]<='Z'&&s[start]>='A'&&s[end]>='A'&&s[end]<='Z')){
if(s[start]>s[end])return "";
else {for(c=s[start];c<=s[end];c++)res+=c;}
}else if(s[start]<='9'&&s[end]>='A'&&s[end]<='Z'){ // 0-Z
for(c=s[start];c<='9';c++)res+=c;
for(c='a';c<='z';c++)res+=c;
for(c='A';c<=s[end];c++)res+=c;
}else if(s[start]>='a'&&s[start]<='z'&&s[end]>='A'&&s[end]<='Z'){ // a-Z
for(c=s[start];c<='z';c++)res+=c;
for(c='A';c<=s[end];c++)res+=c;
}else if(s[start]<='9'&&s[end]>='a'&&s[end]<='z'){ //0-z
for(c=s[start];c<='9';c++)res+=c;
for(c='a';c<=s[end];c++)res+=c;
}else if(s[start]>='a'&&s[start]<='z'&&s[end]>='0'&&s[end]<='9'){ //a-9
for(c=s[start];c<='z';c++)res+=c;
for(c='A';c<='Z';c++)res+=c;
for(c='0';c<='9';c++)res+=c;
}else if(s[start]>='A'&&s[start]<='Z'&&s[end]>='0'&&s[end]<='9'){ //A-9
for(c=s[start];c<='Z';c++)res+=c;
for(c='0';c<=s[end];c++)res+=c;
}else if(s[start]>='A'&&s[start]<='Z'&&s[end]>='a'&&s[end]<='z'){ //A-z
for(c=s[start];c<='Z';c++)res+=c;
for(c='0';c<='9';c++)res+=c;
for(c='a';c<=s[end];c++)res+=c;
}
i=i+2;
}
return res;
}
个人感觉这是比较暴力的解法。
考虑到三者的ASC码不连续并且也不是题目要求的顺序,lz也想过使用一个小写+大写+数字的数组或者循环链表来枚举所有字符,找到两头后依次输出。但该方法只能在展开上简化,并不能简化判断情况,并且还需要更多的空间和查找时间。
各位读者是否有更好的思路?或者说本题就是考面试者的考虑情况是否完善?