分享一个编程面试题:字符串展开


字符串展开
输入一个字符串,包含四种类型的字符,大写字母,小写字母,数字,减号(-)
要求:
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也想过使用一个小写+大写+数字的数组或者循环链表来枚举所有字符,找到两头后依次输出。但该方法只能在展开上简化,并不能简化判断情况,并且还需要更多的空间和查找时间。

各位读者是否有更好的思路?或者说本题就是考面试者的考虑情况是否完善?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值