锁定老帖子 主题:深圳两个上机题,求讨论!
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-22
哦,不好意思,看错了,不能有0出现的。。。
|
|
返回顶楼 | |
发表时间:2010-07-22
最后修改:2010-07-22
biaobiao520 写道 第一个:写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。如:传递表达式"1+2*3+6-2/2"返回计算的结果。
用javascript eval执行。 第二个:9个数1-9组成三个数,如:327 654 981,每个数字只能用一次,每三个数字组成一个新的数字,第二个数是第一个数的两倍,第三个数是第一个数的三倍,用程序实现。 9个数字的排列组合共计9!个,检查其中可以被1002003整除的。 我的实现: 第一个:把传进来的字符串解串,用了以个while循环,只要碰到"+","-","*","/"就记录符号的index,计算index两边的值,然后再组成新的字符串返回,当字符串的长度为一的时候,就是最后的值。因为当时时间紧急,考虑的不是很全面。 第二个:用程序实现不了,但总结了三点规律: 1、三个数的百位数必须是倍数关系 如327 654 981 和 219 438 657 百位数分别为3 6 9和2 4 6 2、三个数的十位数必须均值递增,如上十位数为别为2 5 8和1 3 5 3、三个数的个位数必须均值递减,如上个位数分别为7 4 1和9 8 7 请教大家评论及指点! 恩,思路两分钟,程序5分钟,调试检查3分钟。10分钟搞定。 |
|
返回顶楼 | |
发表时间:2010-07-22
第一个最传统的算法是分为数字栈和符号栈,压栈处理。这是大学时候的作业题啊。
|
|
返回顶楼 | |
发表时间:2010-07-22
第一个就是数据结构书里面栈的那一章的表达式求值\
第二个说实话实在没什么难度. |
|
返回顶楼 | |
发表时间:2010-07-22
最后修改:2010-07-22
第一道不知有没更好的方法呢? 留意牛人中~~
第二道; Set contain = new HashSet(); for (int i = 100; i < 333; i++) { contain.clear(); String result = String.valueOf(i)+2*i+3*i; if(result.indexOf("0")>0) continue; for(char ch : result.toCharArray()) contain.add(ch); if(contain.size() == result.length()) System.out.println(String.valueOf(i)+" "+2*i+" "+3*i); } 结果: 192 384 576 219 438 657 273 546 819 327 654 981 |
|
返回顶楼 | |
发表时间:2010-07-22
最后修改:2010-07-22
看到回复的有思路相同的,但是这里这样限制一下范围会更好:
public static void main(String[] args) { String temp = ""; int t1=0; int t2=0; for(int i=134;i<328;i++){ if(i/10==30) { i+=10; continue; } t1=i*2; t2=i*3; temp=""+i+t1+t2; byte[] b = temp.getBytes(); Arrays.sort(b); temp = new String(b); if(temp.equals("123456789")){ System.out.println(i+";"+t1+";"+t2); } } } 其中的328和134都不是乱取的,可以自己思考一下,刚才看了一下大家都有很多思路的引导 还有,lz的思路我觉得应该是不对的 |
|
返回顶楼 | |
发表时间:2010-07-22
384444165 写道 看到回复的有思路相同的,但是这里这样限制一下范围会更好:
public static void main(String[] args) { String temp = ""; int t1=0; int t2=0; for(int i=134;i<328;i++){ if(i/10==30) { i+=10; continue; } t1=i*2; t2=i*3; temp=""+i+t1+t2; byte[] b = temp.getBytes(); Arrays.sort(b); temp = new String(b); if(temp.equals("123456789")){ System.out.println(i+";"+t1+";"+t2); } } } 其中的328和134都不是乱取的,可以自己思考一下,刚才看了一下大家都有很多思路的引导 还有,lz的思路我觉得应该是不对的 329可以确定。 <34X <33X |
|
返回顶楼 | |
发表时间:2010-07-22
针对第一个问题,我试着写了写代码,发上来,供大家交流。
public class MyTest { /** * 第一个:写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。 * 如:传递表达式"4-(4-3*5+(2*4)+100)/10"返回计算的结果。 * 注意:注释掉的System.out.println为字符串递归解析过程。大家查看时可以把注释去掉,str1、str2、str3分别打印。 * */ public double getResult(String str){ double d = 0d; boolean flag = true;//默认只是一个数字 int k = 0;//0-括号闭合,遇到一个')'就减一,遇到一个'('就加一 //1 算加减,因为加减是左运算,所以倒序遍历 for(int i=str.length()-1;i>=0;i--){ char c = str.charAt(i); if(c==')'){ k--; }else if(c=='('){ k++; } if(k==0){ if(c=='+'){ flag = false; // System.out.println(str.substring(0, i)+" + "+str.substring(i+1)); d = this.getResult(str.substring(0, i)) + this.getResult(str.substring(i+1)); break; }else if(c=='-'){ flag = false; // System.out.println(str.substring(0, i)+" - "+str.substring(i+1)); d = this.getResult(str.substring(0, i)) - this.getResult(str.substring(i+1)); break; } } } //2 算乘除,因为乘除是左运算,所以倒序遍历 if(flag){ for(int i=str.length()-1;i>=0;i--){ char c = str.charAt(i); if(c==')'){ k--; }else if(c=='('){ k++; } if(k==0){ if(c=='*'){ flag = false; // System.out.println(str.substring(0, i)+" * "+str.substring(i+1)); d = this.getResult(str.substring(0, i)) * this.getResult(str.substring(i+1)); break; }else if(c=='/'){ flag = false; // System.out.println(str.substring(0, i)+" / "+str.substring(i+1)); d = this.getResult(str.substring(0, i)) / this.getResult(str.substring(i+1)); break; } } } } //3 算括号 if(flag){ if(str.charAt(0)=='('){ flag = false; // System.out.println(str.substring(1, str.length()-1)); d = this.getResult(str.substring(1, str.length()-1)); } } //4 算数字 if(flag){ d = Double.parseDouble(str); } return d; } public static void main(String[] args) { MyTest mt = new MyTest(); String str1 = "1+2*3+6-2/2"; System.out.println(str1+" = "+mt.getResult(str1)); String str2 = "4-(4-3*5+(2*4)+100)/10"; System.out.println(str2+" = "+mt.getResult(str2)); String str3 = "(4-3*(5+2*4)+100)/(10+2/1)"; System.out.println(str3+" = "+mt.getResult(str3)); } } |
|
返回顶楼 | |
发表时间:2010-07-23
最后修改:2010-07-23
import java.util.ArrayList; import java.util.List; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); List<String> l = t.str(); for (String s : l) { int m = 0;// 控制字符串中是否有相同的字符,如果存在m++ int n = 0;// 控制m的个数 for (int i = 0; i < s.length(); i++) { for (int j = i + 1; j < s.length(); j++) { String a = s.substring(i, i + 1); String b = s.substring(j, j + 1); if (a.equals(b)) { m++; } } if (m == 0) { n++; } } if (n == s.length()) { System.out.println(s.substring(0, 3) + "," + s.substring(3, 6) + "," + s.substring(6, 9)); } } } public List<String> str() {// 过滤出3个三位数m,m*2,m*3,且这3个数自身没有由相同的数字和0组成,例:123,246,369 List<String> list = new ArrayList<String>(); for (int i = 100; i < 1000 / 3; i++) { if (!(i / 100 == i % 100 / 10 || i / 100 == i % 100 % 10 || i % 100 / 10 == i % 100 % 10 || i % 100 / 10 == 0 || i % 100 % 10 == 0)) { int m = i * 2; if (!(m / 100 == m % 100 / 10 || m / 100 == m % 100 % 10 || m % 100 / 10 == m % 100 % 10 || m % 100 / 10 == 0 || m % 100 % 10 == 0)) { int k = i * 3; if (!(k / 100 == k % 100 / 10 || k / 100 == k % 100 % 10 || k % 100 / 10 == k % 100 % 10 || k % 100 / 10 == 0 || k % 100 % 10 == 0)) { String s0 = String.valueOf(i); String s1 = String.valueOf(m); String s2 = String.valueOf(k); StringBuffer sb = new StringBuffer(); String total = sb.append(s0).append(s1).append(s2) .toString(); list.add(total); } } } } return list; } }
|
|
返回顶楼 | |
发表时间:2010-07-23
qiushily2030 写道 第一道不知有没更好的方法呢? 留意牛人中~~
第二道; Set contain = new HashSet(); for (int i = 100; i < 333; i++) { contain.clear(); String result = String.valueOf(i)+2*i+3*i; if(result.indexOf("0")>0) continue; for(char ch : result.toCharArray()) contain.add(ch); if(contain.size() == result.length()) System.out.println(String.valueOf(i)+" "+2*i+" "+3*i); } 结果: 192 384 576 219 438 657 273 546 819 327 654 981 仁兄对Java中的集合理解甚深啊!学习了! |
|
返回顶楼 | |