小米服务器开发笔试题 第一题 转换宏文件名 (JAVA版)
发布于 2017-09-18 23:05 2006 次浏览 0 赞 来自 试题交流  
import java.util.Scanner;
//EvanXU
public class Test{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s =input.nextLine().trim();
        System.out.println(matchString(s));
    }

    public static String matchString(String s) {
        int sLength=s.length();
        char[] cs = s.toCharArray();
        StringBuffer res = new StringBuffer("_" + Character.toUpperCase(cs[0]));
        for (int i = 1; i < sLength; i++) {
            if (cs[i]=='.')
                continue;
            if(cs[i-1]=='.'){
                res.append("_" + Character.toUpperCase(cs[i]));
                continue;
            }
            if(Character.isUpperCase(cs[i])){

                if(Character.isLowerCase(cs[i-1])||(i+1<sLength&&Character.isLowerCase(cs[i+1])))
                     res.append("_" + cs[i]);
                else
                    res.append(cs[i]);
            }
            else if (Character.isLowerCase(cs[i])){
                if (Character.isDigit(cs[i-1]))
                     res.append("_" + Character.toUpperCase(cs[i]));
                else
                    res.append(Character.toUpperCase(cs[i]));
            } else if (Character.isDigit(cs[i])) {
                if (!Character.isDigit(cs[i-1])) {
                    res.append("_"+cs[i]);
                }else {
                    res.append(cs[i]);
                }
            }else {
                System.out.println("IllegalArgument");
            }
        }
        return res.toString();
    }
}


2 条回复

楼主思路很清晰,代码读起来很爽!

不知道你的代码是否通过了测试用例, 我在本地测试的时候123ASTParser时输出 _123AST_PARSER_,我认为正确的结果应该是   _123_AST_PARSER_ 

需要在代码中判断当前大写字母的前一个字母是否为数字,如果是数字需要在大写字母前加"_"

if (Character.isUpperCase(cs[i])) {
    if (Character.isLowerCase(cs[i - 1]) || 
        Character.isDigit(cs[i - 1])    || 
        (i + 1 < len && Character.isLowerCase(cs[i + 1]))) {
            res.append("_" + cs[i]);
    } else {
            res.append(cs[i]);
    }
}


2017-09-19 11:53
//算法是对了没问题的,但就是无法退出那个while(sc.hasNext())循环  求大神解答
import java.util.Scanner;

public class 小米 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc=new Scanner(System.in);
		StringBuffer sb=new StringBuffer();
		
		
		int i,j;
		
		String str,temp;
		while(sc.hasNext()){
			
//			temp=sc.nextLine();
	//		str=new String(temp);
		str=sc.nextLine();	
			str=str.replaceAll("[.]", "_");
			String[]a=str.split("\\D");
			if(a.length!=0){
			for(i=0;i<a.length;i++)
				str=str.replaceFirst(a[i],"_"+a[i]+"_");
			}
			String[]b=str.split("\\p{Upper}|\\d");
			if(b.length!=0){
			for(i=0;i<b.length;i++){
				j=str.indexOf(b[i]);
			    if(j!=0){
			    	b[i]=str.charAt(j-1)+b[i];
			    }
			    str=str.replaceFirst(b[i], "_"+b[i].toUpperCase()+"_");
			}
			}
			str="_"+str+"_";
			str=str.replaceAll("_+", "_");
			sb.append(str+"\n");
			
		}
System.out.println(sb);
	}

}


2017-09-20 11:21
添加回复
回到顶部