算法笔记_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)
时间: 2024-10-11 13:26:35

算法笔记_116:算法集训之代码填空题集三(Java)的相关文章

算法笔记_113:算法集训之代码填空题集一(Java)

 目录 1 报数游戏 2 不连续处断开 3 猜数字游戏 4 串的反转 5 串中找数字 6 递归连续数 7 复制网站内容 8 股票的风险 9 基因牛的繁殖 10 括号的匹配   1 报数游戏 有n个孩子站成一圈,从第一个孩子开始顺时针方向报数,报到3的人出列,下一个人继续从1报数,直到最后剩下一个孩子为止.问剩下第几个孩子.下面的程序以10个孩子为例,模拟了这个过程,请完善之(提示:报数的过程被与之逻辑等价的更容易操作的过程所代替). Vector a = new Vector(); for(in

C++笔试面试(算法题集三)

1>    编写strcpy函数,已知函数原型char*strcpy(char* strDest,char* strSrc) ANSWER: Chat* strcpy(char* strDest,char* strSrc) { If(strSrc==NULL)  return NULL; Char*ch1=strSrc,*ch2=strDest; While(*ch1!='\0') { *ch2++=*ch1++; } *ch2='\0'; Return strDest; } 2>    用递

[暑假集训]区域赛套题集

2014-07-03 [浙江第11届省赛]ZOJ 3785 What day is that day?  (打表找循环节) [暑假集训]区域赛套题集

算法笔记_165:算法提高 道路和航路(Java)

目录 1 问题描述 2解决方案   1 问题描述 问题描述 农夫约翰正在针对一个新区域的牛奶配送合同进行研究.他打算分发牛奶到T个城镇(标号为1..T),这些城镇通过R条标号为(1..R)的道路和P条标号为(1..P)的航路相连. 每一条公路i或者航路i表示成连接城镇Ai(1<=A_i<=T)和Bi(1<=Bi<=T)代价为Ci.每一条公路,Ci的范围为0<=Ci<=10,000:由于奇怪的运营策略,每一条航路的Ci可能为负的,也就是-10,000<=Ci<

【常用算法思路分析系列】链表相关高频题集

本文是[常用算法思路分析系列]的第四篇,总结链表相关的高频题目和解题思路.本文分析如下几个问题:1.环形链表的差值问题:2.只能访问单个结点的删除问题:3.链表的分化:4.打印两个链表的公共部分:5.把链表的每k个结点逆序:6.删除链表中指定结点:7.判断链表是否为回文结构:8.复杂链表的复制:9.判断链表是否有环:10.判断两个无环链表是否相交:11.判断两个有环链表是否相交:12.判断两个链表(状态未定)是否相交. 本系列前三篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析

大学生活6 上课应该记笔记。应不应该有错题集?

个人观点.认为对,就做.认为错,就不做.即可 好记性不如烂笔头.上课应该记笔记,而且每一个必修,专业选修课程都应该有一个笔记本.有的人会说了,每个课程都有一个本子,那得多费钱呀.我说,不呀.你到网上买2,3块钱一个本子,课程笔记不建议你买厚的本子.为啥?你算一算,一学期有多少次课,每次课有几节,一节课你会记多少内容.你就会发现本子不需要太厚的. 每到期末考试阶段,有的同学就会说:史诗级灾难大片开始上演.为什么会出现这种现象?因为平时上课没有好好学习,作业不认真做,而且到了期末考试的时候发现自己手

算法笔记_125:算法集训之编程大题集一(Java)

 目录 1 砝码称重 2 公式解析 3 购物券消费方案 4 机器人行走 5 角谷步数 6 矩形区域的交和并 7 矩阵变换加密法 8 控制台表格 9 拉丁方块填数字 10 立方和等式   1 砝码称重 5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). 本题目要求编程实现:对用户给定的重量,给出砝码组合方案. 例如: 用户输入: 5 程序输出: 9-

算法笔记_164:算法提高 最小方差生成树(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W.保证图连通.n=m=0标志着测试文件的结束. 输出格式 对于每组数据,输出最小方差,四舍五入到0.01.输出格式按照样例. 样例输入 4 51 2 12 3 23 4 24 1 12 4 34 61 2 12 3 23 4 34 1 12 4 31 3 30 0 样

算法笔记_163:算法提高 最大乘积(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组输入数据共2行: 第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15, 第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4. 输出格式 每组数据输出1行,为最大的乘积. 样例输入 15 51 2 3 4 2 样例输出 48 2 解决方案 具体代码如下: import java.uti