多玩笔试题

多玩的三个大题:

1:X和Y是两串长度一样的字符串,X和Y的差异值定义为在两个字符串上对应位置上不一样的字符的个数,比如“ant”和“art”的差异值是1.给定两个字符串A和B,A的长度小于或者等于B,你可以在A的前面或者后面任意添加字符,使得A和B长度一样。写一个方法求出最后能得到的最小的差异值是多少?

说明:A和B的长度范围是[1,50] , A和B的字符只包含‘a’-'z' ,A的长度小于或者等于B

这个题目做出来了,可是在笔试的时候递归那个地方写错了一点~~没有比较count了,下面是我的递归解法:

int  minimize(String a , String b){ 
    int alen = a.length(); 
    int blen = b.length(); 
    int count =50; 
    if(alen==blen){ 
         count=0; 
        for(int i=0;i<alen;i++){ 
            if(a.charAt(i)!=b.charAt(i)) count++; 
        } 
        return count; 
    } 
            String first = b.substring(1); 
            String last = b.substring(0, b.length()-1); 
             
            return Math.min(Math.min(minimize(a,first), minimize(a,last)),count); 

    int  minimize(String a , String b){
        int alen = a.length();
        int blen = b.length();
        int count =50;
        if(alen==blen){
             count=0;
            for(int i=0;i<alen;i++){
                if(a.charAt(i)!=b.charAt(i)) count++;
            }
            return count;
        }
                String first = b.substring(1);
                String last = b.substring(0, b.length()-1);
               
                return Math.min(Math.min(minimize(a,first), minimize(a,last)),count);
    }


2:有一堆石子,或者被涂成红色或者被涂成绿色,从左到右排成一排。要求你用最小的次数对石子进行重新上色(不过只能涂成红色或者绿色),使得所有红色的石子都排在绿色石子的左边。程序输入参数为一个字符串String row,里面的每个字符只能是‘R’(代表红色)或者‘G’(代表绿色)。求出最少涂色几次,就能让所有红色的石子排在绿色石子的左边。

在考试的时候我是用递归来做,具体方法是求较小的值min("把一个石子上红色",“把一石子上绿色”)这样递归下去,终止条件是当字符串满足题意的时候。后来回来一想,根本没那么复杂,只要求做右边的R前面有几个G,最左边的G后面有几个R,然后取他们中的较小就可以了。只恨考试的时候怎么没发挥出来!!!!!(这个方法我测试了很多都正确,具体原理还有待考察),代码如下:


[java] view plaincopyprint?
int minPaint(String row){ 
        char[] c = row.toCharArray(); 
        int rCount = 0; 
        int gCount = 0; 
        int i; 
        for( i=c.length-1;i>=0;i--){   
            if(c[i]=='R') //求做右边的R  
                break; 
        } 
        while(i>=0){ 
            if(c[i]=='G')   //最右边的R前面有几个G  
                gCount++; 
            i--; 
        } 
        for(i=0;i<c.length;i++){ 
            if(c[i]=='G')   //求最左边的G  
                break; 
        } 
        while(i<c.length){ 
            if(c[i]=='R')  //最左边的G后面有几个R  
                rCount++; 
            i++; 
        } 
        return Math.min(rCount, gCount);  //取教小的  
    } 

int minPaint(String row){
        char[] c = row.toCharArray();
        int rCount = 0;
        int gCount = 0;
        int i;
        for( i=c.length-1;i>=0;i--){ 
            if(c[i]=='R') //求做右边的R
                break;
        }
        while(i>=0){
            if(c[i]=='G')   //最右边的R前面有几个G
                gCount++;
            i--;
        }
        for(i=0;i<c.length;i++){
            if(c[i]=='G')   //求最左边的G
                break;
        }
        while(i<c.length){
            if(c[i]=='R')  //最左边的G后面有几个R
                rCount++;
            i++;
        }
        return Math.min(rCount, gCount);  //取教小的
   

}

3:有一个简单的编辑器只有两种命令

‘type <c>’,c是一个字符:把c添加到文本的末尾

‘undo <t>’,t是一个正整数:回滚t秒前所执行的操作,说明undo命令也可以被undo,undo命令对很久之前的操作不起作用

要求:编写一个函数public String getText(String[] cmds,int[] time)

cmd是输入的命令,包括上面两种命令,c取值a~z,t范围1~10^9   time是每个命令执行的时间。

示例:{"type a","type b","type c","type 3"}  {1,2,3,5}   Return:“a”

            {"type a","type b","undo 2","type 2"}  {1,2,3,4}   Return:“a”

           {"type a","undo 1","undo 1"}  {1,2,3}   Return:“a”
          {"type a","type b","type c","undo 10"}  {1,2,3,1000}   Return:“abc”

这个题目是最后一道编程题,我没有时间做了,回来想了一下,没那么难,为什么现场笔试的时候会时间不够呢??????? 我的思路是:从后往前读命令,遇到undo命令就比较undo需要回退的时间,把这一段时间的操作都忽略,如果遇到type命令,则保留字符。最后输出字符的反转就ok了。我的代码如下:

public static void main(String[] args) {   
    String[] c = {"type a","type b","type c","undo 10"}; 
    int[] t = {1,2,3,1000}; 
    System.out.println(getText(c,t)); 
   } 
public static String getText(String[] cmds,int[] time){ 
    StringBuffer sb = new StringBuffer(""); 
    int t = time[time.length-1]; 
    for(int i=cmds.length-1;i>0;){   //从后往前读命令  
        if(cmds[i].contains("undo")){  //  遇到undo命令  
            if(time[i]-time[i-1]>100){  //如果是隔了100秒以上,则undo命令不失效  
                i--; 
                continue; 
            } 
            else{ 
                int u = Integer.parseInt(cmds[i].substring(5)); 
                t = time[i]-u-1;    //undo命令回退的时间  
                while(time[i]>t){      
                    i--; 
                } 
            } 
        } 
        else{ 
            sb.append(cmds[i].substring(5)); //遇到type命令  
            i--; 
        } 
    } 
    if(cmds[0].contains("undo"))   //第一个命令单独处理  
        return sb.reverse().toString(); 
    else 
        return sb.append(cmds[0].substring(5)).reverse().toString(); 

    public static void main(String[] args) { 
        String[] c = {"type a","type b","type c","undo 10"};
        int[] t = {1,2,3,1000};
        System.out.println(getText(c,t));
    }
    public static String getText(String[] cmds,int[] time){
        StringBuffer sb = new StringBuffer("");
        int t = time[time.length-1];
        for(int i=cmds.length-1;i>0;){   //从后往前读命令
            if(cmds[i].contains("undo")){  //  遇到undo命令
                if(time[i]-time[i-1]>100){  //如果是隔了100秒以上,则undo命令不失效
                    i--;
                    continue;
                }
                else{
                    int u = Integer.parseInt(cmds[i].substring(5));
                    t = time[i]-u-1;    //undo命令回退的时间
                    while(time[i]>t){    
                        i--;
                    }
                }
            }
            else{
                sb.append(cmds[i].substring(5)); //遇到type命令
                i--;
            }
        }
        if(cmds[0].contains("undo"))   //第一个命令单独处理
            return sb.reverse().toString();
        else
            return sb.append(cmds[0].substring(5)).reverse().toString();
    }以上算法都是我自己的思考,不对之处,还望读者在后面指出,如果大家有更好的解法,也欢迎一起探讨!!!

其中试卷中还有一个小问题影响很深,现在也没弄明白,题目是这样的,下面代码输出什么:

[java] view plaincopyprint?
class Country  { 

public class City extends Country { 
    public static void main(String[] args) { 
           City c=new City(); 
           new City().yy(); 
       } 
    public  void yy() { 
        System.out.println(this.getClass().getName()); 
        System.out.println(super.getClass().getName()); 
    } 

class Country  {
}
public class City extends Country {
    public static void main(String[] args) {
           City c=new City();
           new City().yy();
       }
    public  void yy() {
        System.out.println(this.getClass().getName());
        System.out.println(super.getClass().getName());
    }
}结果都是City,望知道的解释一下!!!

posted @ 2012-11-11 22:49  Mr.Rico  阅读(272)  评论(0编辑  收藏  举报