算法笔记_116:算法集训之代码填空题集三(Java)
Posted 舞动的心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法笔记_116:算法集训之代码填空题集三(Java)相关的知识,希望对你有一定的参考价值。
目录
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)
以上是关于算法笔记_116:算法集训之代码填空题集三(Java)的主要内容,如果未能解决你的问题,请参考以下文章