zoukankan      html  css  js  c++  java
  • 算法笔记_116:算法集训之代码填空题集三(Java)

     目录

    1 数组转置

    2 文件管理

    3 显示为树形

    4 杨辉三角系数

    5 圆周率与级数

    6 整数翻转

    7 自行车行程

    8 祖冲之割圆法

    9 最大5个数

    10 最大镜像子串

     


    1 数组转置

        编写程序将2行3列的数组行列置换复制给3行2列的数组(即数组的转置)。已经写了如下代码,请完善之:
    
    class  y{
        public static void main(String[] args) throws Exception {
            int a[][]={{1,2,3},{4,5,6}};
            int b[][]=new int[3][2];
            for(int i=0;i<2;i++){
                for(int j=0;j<3;j++){
                    _____________________;
                }    
            }            
        }
    }
    
    
    b[j][i] = a[i][j]

    2 文件管理

        显示“DaSai”目录下以”Ex”开头的文件和目录,写了如下代码,请完善之:
    
    import java.io.*;
    class JavaFilter implements FilenameFilter{
        String jf;
        JavaFilter(String s){
            jf=s;
        }
        //实现FilenameFilter接口的accept()方法
        public boolean accept(File dir,String name){
            return name.startsWith(jf);//name的前缀是否是参数jf
        }
    }
    public class  Ex{
        public static void main(String[] args) throws Exception {
            File f=new File("/DaSai");
            //过滤以“Ex”开头的文件和目录,存放到字符串数组s中。
            String s[]=____________________________;
            for(int i=0;i<s.length;i++){
                File ff=new File(s[i]);// 根据s[i]创建File类对象
                if(ff.isDirectory())
                    System.out.println(s[i]+" is a directory");
                else
                    System.out.println(s[i]+" is a file");
            }
        }
    }
    
    f.list(new JavaFilter("Ex"))

    3 显示为树形

    树形结构应用十分广泛。
    
    下面这段代码根据用户添加的数据,在内存中构建一个逻辑上等价的树形结构。
    
    通过ShowTree() 可以把它显示为控制中的样子。
    
    其中:
      a.add('a', 'b');
      a.add('b', 'e');
    表示:'b' 作为 'a' 的孩子节点;'e' 作为 'b'的孩子节点。
    如代码中给出的示例数据,输出结果应该为:
    
    a--b--e
    |  |--f--j
    |     |--k
    |--c
    |--d--g--h
       |--i
    
    
    请阅读下面的代码,填写缺失的部分(下划线部分)。
    
    注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
    直接写在题面中不能得分。
    
    
    
    import java.util.*;
    
    class MyTree
    {
        private Map map = new HashMap();
        
        public void add(char parent, char child)
        {
            List<Character> t = (List<Character>)map.get(parent);
            if(t==null)
            {
                t = new Vector<Character>();
                ____________________;  // 填空1
            }
            t.add(child);
        }
        
        public List<Character> getChild(char x)
        {
            return (List<Character>)map.get(x);
        }
    }
    
    public class My
    {
        public static List<String> showTree(MyTree tree, char x)
        {
            List<Character> t = tree.getChild(x);
            
            List<String> r = new Vector<String>();
            
            if(t==null)
            {
                r.add("" + x);
                return r;
            }
                    
            for(int i=0; i<t.size(); i++)
            {
                List<String> ri = showTree(tree, t.get(i));
                for(int j=0; j<ri.size(); j++)
                {
                    String pre = "|  ";
                    if(j==0)
                    {
                        if(i==0)
                            pre = x + "--";
                        else 
                            pre = "|--";
                    }
                    else
                    {
                        if(i==__________________)    // 填空2
                            pre = "   ";
                        else
                            pre = "|  ";
                    }
                    
                    r.add(pre + ri.get(j));
                }
            }
            
            return r;
        }
        
        public static void main(String[] args)
        {
            MyTree a = new MyTree();
            a.add('a', 'b');
            a.add('b', 'e');
            a.add('b', 'f');
            a.add('a', 'c');
            a.add('a', 'd');
            a.add('d', 'g');
            a.add('d', 'i');
            a.add('g', 'h');
            a.add('f', 'j');
            a.add('f', 'k');
            
            List<String> lst = showTree(a, 'a');
            for(int i=0; i<lst.size(); i++)
            {
                System.out.println(lst.get(i));
            }
        }
    }
    
    
    map.put(parent, t)
    i== t.size()-1

    4 杨辉三角系数

        (a+b)的n次幂的展开式中各项的系数很有规律,对于n=2,3,4时分别是:1 2 1, 1 3 3 1,1 4 6 4 1。这些系数构成了著名的杨辉三角形:
    
                     1
                   1   1
                  1  2  1
                1  3   3   1
              1  4   6   4   1
            1  5  10  10   5   1
    
    下列的程序给出了计算第m层的第n个系数的计算方法,试完善之(m,n都从0算起)。
    
        public static int f(int m, int n)
        {
            if(m==0) return 1;
            if(n==0 || n==m) return 1;
            return __________________________; 
        }
    
    
    f(m - 1, n - 1) + f(m - 1, n)

    5 圆周率与级数

    圆周率
    
    我国古代数学家对圆周率方面的研究工作,成绩是突出的。三国时期的刘徽、南北朝时期的祖冲之都在这个领域取得过辉煌战绩。
    有了计算机,圆周率的计算变得十分容易了。如今,人们创造了上百种方法求π的值。其中比较常用且易于编程的是无穷级数法。
    π/4 = 1 – 1/3 + 1/5 – 1/7 + 1/9 - …
    是初学者特别喜欢的一个级数形式,但其缺点是收敛太慢。
    π/2 = 1 + 1/3 +1/3*2/5 + 1/3*2/5*3/7 + 1/3*2/5*3/7*4/9 + …
    是收敛很快的一个级数方法。下面的代码演示了用这种方法计算π值。请填写缺失的代码部分。把填空的
    答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
    
        double x = 1;
        double y = 1;
        int a = 1;
        int b = 3;
        
        while(y>1e-15)
        {
            y =  __________;
            x += y;
            a++;
            b += 2;
        }
        
        System.out.println(x*2);
    
    
    y * a / b

    6 整数翻转

        以下程序把一个整数翻转(8765变为:5678),请补充缺少的代码。
    
            int n = 8765;
            int m = 0;
            while(n>0)
            {
                m = ________________________;
                n = n / 10;
            }        
            System.out.println(m);
    
    
    
    m * 10 + n % 10

    7 自行车行程

    计算行程
    
    低碳生活,有氧运动。骑自行车出行是个好主意。小明为自己的自行车装了个计数器,可以计算出轮子转动的圈数。在一次骑车旅行中,出发时计算器的示数为begin,到达目的地时的示数为end。下列代码计算了小明一共骑行了多远(单位:公里)。其中d表示小明自行车轮子的直径(单位:米)。
    
    把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
    
        public static double getDistance(int begin, int end, double d)
        {
            return (end-begin) * Math.PI * d _________; 
        }
    
    /1000

    8 祖冲之割圆法

        南北朝时,我国数学家祖冲之首先把圆周率值
    
    计算到小数点后六位,比欧洲早了1100年!他采
    
    用的是称为“割圆法”的算法,实际上已经蕴含
    
    着现代微积分的思想。
    
        如图【1.jpg】所示,圆的内接正六边形周长
    
    与圆的周长近似。多边形的边越多,接近的越好
    
    !我们从正六边形开始割圆吧。
    
        如图【2.jpg】所示,从圆心做弦的垂线,可
    
    把6边形分割为12边形。该12边形的边长a'的计
    
    算方法很容易利用勾股定理给出。之后,再分割
    
    为正24边形,....如此循环会越来越接近圆周。
    
        之所以从正六边开始,是因为此时边长与半径
    
    相等,便于计算。取半径值为1,开始割圆吧!
    
        以下代码描述了割圆过程。
        
        程序先输出了标准圆周率值,紧接着输出了不
    
    断分割过程中多边形边数和所对应的圆周率逼近
    
    值。
    
    public class B21
    {
        public static void main(String[] 
    
    args)
        {
            System.out.println("标
    " + Math.PI);
            
            double a = 1; 
            int n = 6;
            
            for(int i=0; i<10; i++)
            {
                double b = 
    
    Math.sqrt(1-(a/2)*(a/2));
                a = 
    
    Math.sqrt((1-b)*(1-b) + (a/2)*(a/2));
                
                n = 
    
    ______________; //填空
                
                
    
    System.out.println(n + "  " + _______________);  
    
    // 填空
            }
        }
    }
    
    
    
    请分析代码逻辑,并推测划线处的代码。
    
    答案写在 “解答.txt” 文件中
    
    注意:只写划线处应该填的内容,划线前后的内
    
    容不要抄写。
    
    
    n * 2
    a / 2 * n
    
    标准 3.141592653589793
    12  3.105828541230249
    24  3.1326286132812378
    48  3.1393502030468667
    96  3.14103195089051
    192  3.1414524722854624
    384  3.141557607911858
    768  3.1415838921483186
    1536  3.1415904632280505
    3072  3.1415921059992717
    6144  3.1415925166921577

    9 最大5个数

        [12,127,85,66,27,34,15,344,156,344,29,47,....]  
    
        这是某设备测量到的工程数据。
    
        因工程要求,需要找出最大的5个值。
    
        一般的想法是对它排序,输出前5个。但当数据较多时,这样做很浪费时间。因为对输出数据以外的数据进行排序并非工程要求,即便是要输出的5个数字,也并不要求按大小顺序,只要找到5个就可以。
    
        以下的代码采用了另外的思路。考虑如果手里已经抓着5个最大数,再来一个数据怎么办呢?让它和手里的数据比,如果比哪个大,就抢占它的座位,让那个被挤出来的再自己找位子,....
    
    import java.util.*;
    public class B23
    {
        public static List<Integer> max5(List<Integer> lst)
        {
            if(lst.size()<=5) return lst;
            
            int a = _______________________;  // 填空
            List<Integer> b = max5(lst);
            
            for(int i=0; i<b.size(); i++)
            {
                int t = b.get(i);
                if(a>t)
                {
                    __________________;  // 填空
                    a = t;  
                }
            }
            
            return b;
        }
        
        public static void main(String[] args)
        {
            List<Integer> lst = new Vector<Integer>();
            lst.addAll(Arrays.asList(12,127,85,66,27,34,15,344,156,344,29,47));        
            System.out.println(max5(lst));
        }
    }
    
    
        请分析代码逻辑,并推测划线处的代码。
    
        答案写在 “解答.txt” 文件中
    
        注意:只写划线处应该填的内容,划线前后的内容不要抄写。
    
    
    lst.remove(0)
    lst.set(i, a) 或者 b.set(i, a)

    10 最大镜像子串

    【代码填空】(满分12分)
        
        串“abcba”以字母“c”为中心左右对称;串“abba” 是另一种模式的左右对称。这两种情况我们都称这个串是镜像串。特别地,只含有1个字母的串,可以看成是第一种模式的镜像串。 
    
        一个串可以含有许多镜像子串。我们的目标是求一个串的最大镜像子串(最长的镜像子串),如果有多个最大镜像子串,对称中心靠左的优先选中。例如:“abcdeefghhgfeiieje444k444lmn”的最大镜像子串是:“efghhgfe”
    
        下面的静态方法实现了该功能,请仔细阅读并分析代码,填写空白处的代码,使得程序的逻辑合理,结果正确。
    
    // 求最大(长度最大)镜像对称子串
    public static String getMaxMirrorString(String s)
    {
        String max_s = "";  // 所求的最大对称子串
    
        for(int i=0; i<s.length(); i++)
        {
            // 第一种对称模式
            int step = 1;
            try{
                for(;;)
                {
                    if(s.charAt(i-step) != s.charAt(i+step)) break;
                    step++;
                }
            }catch(Exception e){}
            
            String s1 = s.substring(_____________________________);     // 填空1
            
            
            // 第二种对称模式
            step = 0;
            try{
                for(;;)
                {
                    if(_________________________________) break;    // 填空2
                    step++;
                }
            }catch(Exception e){}
            
            String s2 = s.substring(i-step+1,i+step+1);
            
            
            if(s1.length() > max_s.length()) max_s = s1;
            if(s2.length() > max_s.length()) max_s = s2;
        }
        
        return max_s;                
    }
    
    
    【注意】
        只填写缺少的部分,不要抄写已有的代码。
        所填写代码不超过1条语句(句中不会含有分号)
        所填代码长度不超过256个字符。
        答案写在“解答.txt”中,不要写在这里!
    
    i - step + 1, i + step
    s.charAt(i - step) != s.charAt(i + step + 1)
  • 相关阅读:
    python第八课
    python第七课
    python第六课
    python第五课
    Python基础30类-内置函数实现迭代器协议
    Python基础29类-内置函数(__format__,__slots__,__doc__,__module__,__del__,__call__)
    Python基础28类-内置函数(__getattribute__,__getitem__,__setitem__.__delittem__)
    Python基础27类-包装、组合方式授权、判断对象类型的方法
    Python基础26类-内置函数__setattr__,__getattr__,__delattr__
    Python基础25类-反射
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6628431.html
Copyright © 2011-2022 走看看