为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Java由浅入深解决一道数字组合题的方案 (1)

2012-10-20 3页 pdf 199KB 34阅读

用户头像

is_607706

暂无简介

举报
Java由浅入深解决一道数字组合题的方案 (1) ⋯ 【_ , ⋯ ‘ } 实用第一 /智慧密集 ⋯ ⋯ 一 ⋯ ⋯ ⋯ ⋯ 一 Java由浅入溶解决一道熬警组合蘑 案 朱成军 ●⋯ _ 摘 要 : 发 之 美。 关键词 : 对数字组合题本身进行要点分析,通过 4种不同的程序风格由浅入深地介绍Java程序开 Java由浅入深;Java API;正则表达式;数字组合 1 题目与分析 1.1 题 目 一 道数字组合题要求 :9个数字 l一9组成 3个数 ,如 : 327 654 981.每个数字只能用一次,每3...
Java由浅入深解决一道数字组合题的方案 (1)
⋯ 【_ , ⋯ ‘ } 实用第一 /智慧密集 ⋯ ⋯ 一 ⋯ ⋯ ⋯ ⋯ 一 Java由浅入溶解决一道熬警组合蘑 案 朱成军 ●⋯ _ 摘 要 : 发 之 美。 关键词 : 对数字组合题本身进行要点分析,通过 4种不同的程序风格由浅入深地介绍Java程序开 Java由浅入深;Java API;正则表达式;数字组合 1 题目与分析 1.1 题 目 一 道数字组合题要求 :9个数字 l一9组成 3个数 ,如 : 327 654 981.每个数字只能用一次,每3个数字组成一个组的 数字;第二组数字是第一组数字的两倍 ;第 3组数字是第一组 数字 的 3倍 .用程序实现 。 1.2 要点分析 根据题 目要求进行要点分析 : (1)9个数字 1-9组成 3个数 :三组数字 中不能能包含 0。 (2)每个数字只能用一次:可以推算出3组数字中最大一 组数字的值不能超过987,最小一组数字的值不能小于 123。 (3)每 3个数字组成一个组的数字,第二组数字是第一组 数字的两倍,第二三组数字是第一组数字的3倍:由3组数字之 间的关系可以推断出第一组数字为最小,且最小值为 123,由 第i组数字是第一组数字的3倍可以将第一组数字最大值定位 在 333.义因为第二个要点决定了第一组数字的第二位只能是 2.不难得出第一组数字的第三位最大就是 9了。由此推出第 一 组数字的最大值为 329,最小值为 123。 (4)第二组数字是第一组数字的两倍 ,第三组数字是第一 组数字的 3倍 :根据相互关系很快能够得到第二组数字和第三 组数字。同时结合第二点分析进行结果排重后得到正确结果。 2 算法与描述 根据 1.2的要点分析 Java类基本结构已经呈现出来 了,类 中最 多需要 2个方 法: (1)校验方法:用于数字排重和排除三组数字中包含0的 结果 。 (2)3组数字产生方法:产生的3组数字进行组合进行校 验,符合的就是目标结果。 类中第一个基本校验方法貌似公用的,这里给出命名为 vaildRepeat(String str),由 函数 名可 知有重 复 的返 回为 true, 否则返回为false。 2012.01 电■11程技巧与 壤 这个方法输入参数为一个字符 串,该字符 串可 以是第一组 数字、第一 、第二组数字组合或者是第一、第二、第三组数字 组合的一个字符串。所以方法体定义为如下: public static Boolean va ldRepeat(Str{ng str) { Boolean flag=false; return flag; ) 校验方法第一步就是检查方法输入参数 中是否包含 0,如 果包含 0立刻返 回一个 true,一行 代码 :if(str.indexOf(”0”) >0) {retum true;} 方法第二步就是检查数字 l到9在输人参数中出现的次数, 因为题 目中已经限制了数字只能出现一次,所以只要统计这 9 个数字在字符串中出现 的次数就可 以了。很明显每个数字统计 结果只能是 O和 1。所以在类初始位置定义了 2个 final类型的 静态常量,静态常量的修改可以帮助解决本题目后续延伸问题。 private static final int MAX DISPLAY — CNT=1://数字统 //计最大出现次数 private static final String 【】NBR—STR_ARR={ 1 ,”2”.“3“,“ 4“,”5 , 6 , 7”,”8“,“9 } //枚举出所有可能出现的数字作为一个常量 //数组,用于后续统计每个数字出现次数; 统计这 9个数字在字符串中出现的次数相信不是件难事 , 下面按照对 Java编程熟悉程度不同给出4种不同的程序描述。 2.1 入 门级代码 入门级代码主要是分别生成 3组数字,因为第一组数字 的范围已经可 以确定了 ,所 以循环 的起始 和终止也就有 ,代码 如下 : for(int i=123:i<:329:i++)∥注意中间是小于等于 入门级代码中需要分别产生出 3组数字 ,由于每组数字 是一个不定长的数组,在方法的起始的地方定义了 2个 Ar- rayList数组 .分别为 firstList、seeList,分别用于存储符合条件 的第一组数字和第二组数字。 第一组数字要求在 123到 330之间的所有符合前 3位不 重复且不含0的数字组合,符合条件的存人到firstList。 第二组数字是在 firstList的范围中 2,转换成字符串后和 一 ⋯ PROGRAM LANGUAGE ~ ⋯ ⋯ 一⋯ ⋯ ⋯ m ⋯⋯ ⋯ 第一组数字进行拼接成一个字符串,调用 vaildRepeat()方 public static void fun20{ 法,返回值为蹦se的存人到secList。 StringButfer newStr null; 第三组数字在secust列表范围中的数字除以2,然后乘以 fo (;nt i=’2 <=329 +: ,、 3,除法结果拼接 secList记录然后再拼接乘 以 3的结果转化成字 newStr .append(i).app end(i*2 ppend(i*3): 符串,调用 vaildRepeat()方法返回值为false的记录就是结果。 if(!v dRepeat(newstr.toString0)){ fun1代码如下 : System.out.println(”Fun2:”+i+ ,”+i 2+“,”+i 3) public static void fun 1 0{ ) ArrayList firstList:new ArrayList0,secList:neW ArrayList0: } StringBu什er newStr=new StringBuffer0 } int vl=0,v2=0.v3=0;//9~JJ存储第一、第二、 2.3 运用 Java API代码 ,/第三个数字组合 ∥第一步找出前三位不重复的数子组合 for《int i=123;i<=329;i++){//数值分析 最大值 为 329,最小值为 123 if(!vajldRepeat(Str1ng.valueOf(i))){ firstList.add(String.valueOf(i)); ) ) ∥第二步在第一步基础上对第一步结果进行 2,并 //进行不重复验证 for(int i=0;i答案
。 2.4 正则表达式方法 除了上面 3种程序外,资深Java程序员又给出了一个更 高效 、更简洁的方法 ,那就是正则表达式。通过正则表达式 去做验证从代码的简洁度 、代码执行效率上来讲都是无可挑 剔的。 使用正则表达式就先要找到一个表达式,这个表达式需要 符合 1-9数字不重复且不包含 0的 2个要求。数字不重复表达 式 “\\d d)\\d \\l”,另外一点是不包含 0,在表达式的末尾 增;~fl10,全部就是 “\\d d)\\d \\110”。 ⅢY.⋯ ⋯⋯ ⋯ ⋯ ⋯ 一 ⋯ ⋯ ⋯⋯ ⋯ ⋯⋯ ⋯ ⋯ ⋯⋯ ⋯ ⋯ 实用第一 智慧密集 ⋯ ⋯ ⋯ ⋯ , 一 ⋯ ⋯ . 。 : public static void fun40{ StringBuffer newStr=null; Pattern P:Pattern.compile(‘\\d kkl for(int i:123;i<329;i++){ newStr=new StringBufferO; newStr.append(i).append(i 2).append(i 3): if(f p.matcher(newStr.toStringO).find0){ System.out.println(“Fun4:“+i+”, +i 2+ , +i 3): ) } ) 最后还需 针对不 同方法引用 不同的包 : (1)入门级代码中需要引入包:java.util.ArrayLis。 (2)运用 Java API代码需要 引入包 :java.util.Arrays。 (3)正则表达式方法需要引人包 :java.util.regex.Pattern。 在类 中定义~个 main函数 .分别调用类 中的方法得 到同 样的结果.为了能在 main方法中不定义对象直接调用类中的 方法,需要将各个方法定义成 static(静态)方法。 public static void main(String[】args){ System.out.println( Java基本算法 “”“): fun1(): System.out.println(“” Java改进算法 ””} fun20; System out.println(” “Java接口型算法 “ “): fun30; System out.println(” ” 正则表达式算法 ) fun40; ) 运行结果 如下 : “ Java基本算法 “ Fun1:192,384.576 Fun1:21 9.438,657 Fun1:273,546.81 9 Fun1:327,654,981 “ Java改进算法 ” “ Fun2:1 92,384,576 Fun2:21 9,438,657 Fun2:273,546,81 9 Fun2:327,654.981 ”Java接 口型算法 “ Fun3:1 92,384,576 Fun3:21 9,438,657 .S .^止—址 .S屯.S .s止—SlL .址 .S也.‘‘L 舢 J止 Fun3:273,546,81 9 Fun3:327,654,981 **” 正则表达式算法 “ Fun4:192,384,576 Fun4:21 9.438,657 Fun4 273,546.81 9 Fun4:327,654,981 3 结语 回过头来看一下 4个方法代码中需要注意的几个点: (1)final类型的静态常量的运用 在类开 始定 义 了 2个 final类型 的静态常 量 ,为什 么不把 fun3 f1中的 targetStr也定义成一份 矗nal类 型的静态常量呢? 按照Java基础知识中对于静态常量的定义也可以将 target— Str定义为final类型的静态常量.但是实际使用过程中targetStr 没有被外部函数重复调用,所以定义为~个方法的局部变量 , 方法执行完了 targetStr所 占用的内存就立刻被释放了。 MAX _ DISPLAY— CNT和 NBR STR_ARR在 校验 函数 中频 繁使用.为了避免每次使用时重新分配内存区域 ,提高程序执 行效率.在类初始化是加载到静态内存区域中,随着类对象生 命周期结束,静态变量占用的内存区域也同时被回收。 (2)funl 0代码中ArrayList数组为什么是 2个而不是 3 个 呢? 因为 2个 ArrayList对象分别用于临时存储符合条件的第一 组 数字 和第 二组 数字 的 .当 secList的对象生 成结束后 , firstList就已经没有存在的必要了,可以对其进行置 null便于 GC进行内存立即回收了。 (3)StringBuffer的使用 代码 中多次使用到 StringBuffer newStr:null;然后在循 环中 才进行实例化操作 newStr=new StringBuffer 0;,而不是在循 环体内部进行 StringBuffer newStr=new StringBuffer 0:,这样 做的好处是 newStr内存可以重复使用 ,减少内存消耗。另外 append()方法可以直接将 int型数字 自动转化成 String进行 字符串拼接 。 上面4种算法由浅入深地介绍了本题解决,运行效率 不断提升。从 4种方案让人感受到了 Java程序开发之美。但 是由此题进行延伸的话,将题 目中的每个数字只能用~次改为 每个数字只能用 N次 ,N在 1到 9之间。 (收稿 日期 :2011-08—18) (上接第4l贞) 参考文献 【11 王晟.Visual C#.NET数据库开发经典案例解析.清华大学 出版社 .2005. 144 20确12囊. 01远与雏iiii 【2]Glenn JohnSon.ADO.NET 2.0高级编程.清华大学出版社, 2006. [3】3 Microsoft Visual Studio 2005 Documentation. (收稿 日期:2011—08一O9)
/
本文档为【Java由浅入深解决一道数字组合题的方案 (1)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索