锁定老帖子 主题:深圳两个上机题,求讨论!
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-21
哈哈,想到上面的方法了,,,,,传说java7有闭包,那就简单了吧
|
|
返回顶楼 | |
发表时间:2010-07-21
linchao198401 写道 biaobiao520 写道 第一个:写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。如:传递表达式"1+2*3+6-2/2"返回计算的结果。
第二个:9个数1-9组成三个数,如:327 654 981,每个数字只能用一次,每三个数字组成一个新的数字,第二个数是第一个数的两倍,第三个数是第一个数的三倍,用程序实现。 我的实现: 第一个:把传进来的字符串解串,用了以个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 请教大家评论及指点! 首先,1+2*3+6-2/2我们知道二叉树的中序遍历。然后使用后序遍历就变成了逆波兰。就是123*+622/-+ 把逆波兰的串压入栈,就是 遇到计算符号就弹出栈的最高两位进行计算。 / * 2 2 - 3 3 + 2 2 2 1 + 2 2 2 6 6 6 6 6 6 5 1 1 1 1 1 7 7 7 7 7 7 12 只要处理好中序和后序遍历就可以了,编程需要花点时间。 第二道题目 我也想到穷举法,当然能找到规律的话,就能让穷举的范围更小的一点,但是首先要保证规律的正确性。 这样的规律能找到越多,需要遍历的数字就越少,效果越好。 大的步骤是: 1.列出所有可能的第一个数 2.根据第一个数得到第二个以及第三个数的值 3.根据3个数值的9个数字,判断是否有重复的数字,没有重复的数字就是我们要的结果 第一个数的百位肯定是123之间选择,如果是4,那么第三个数将超过1000. 十位如果在百位是3的时候,可能不会是3,也不能比3大,所以只能是1和2. 也就是32*, 31*, 1**, 2** 是保证第一个数是正确的。 32* 有9-2=7种可能 31* 有7种可能 1** 有8 * 7=56种可能 2** 有56种可能 也就是需要for 7 + 7 + 56 + 56 = 126 当然列出所有的可能性也是需要一个程序完成的。可以编写另外的一个函数调用,也许想修改列出的算法也方便点。 对第一个数字乘以2,得到第二个数字 对第一个数字乘以3,得到第三个数字 这时候就有9个数字,接下去要做的就是判断这些数字里面是否有重复的,如果没有重复的就是想要的结果之一。 如何判断是否有重复的数字呢? 1. 用1-9遍历9个数字,如果发现有个数字找到两次,马上停止返回。9个数字遍历9遍。当然前面三位例如321,肯定是不会重复的,在比较3,2,1的时候可以跳过前面3个数字,但是这样算法就复杂了,也不能节省多少的时间。 2. 排序,然后两两比较是否相等 3. 用9个int型的数组,遍历一遍9个数字就可以,如果遍历到是1,那么置数组0位为1,遍历到2,那么置数组1位为1,如果发现本来已经是1了,那么就表示重复,这个需要9个int的空间,只需要遍历一次,比较也是判断是否为1. 分析得很好,佩服! |
|
返回顶楼 | |
发表时间:2010-07-21
wanghe 写道 ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
System.out.println(jse.eval("1+2*3+6-2/2")); 这得引用js的引擎包啊 |
|
返回顶楼 | |
发表时间:2010-07-21
第一个题应该是考你栈的使用吧
|
|
返回顶楼 | |
发表时间:2010-07-21
写道
第二个:用程序实现不了,但总结了三点规律:
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 分析出错了, public static void main(String[] args) { for (int x = 123; x < 387; x++) { TreeSet<Integer> ts = new TreeSet<Integer>(); ts.addAll(getNumList(x)); ts.addAll(getNumList(2 * x)); ts.addAll(getNumList(3 * x)); if ("[1, 2, 3, 4, 5, 6, 7, 8, 9]".equals(ts.toString())) { System.out.println("x=" + x); System.out.println("y=" + 2 * x); System.out.println("z=" + 3 * x); System.out.println("---------------------------"); } } } private static List<Integer> getNumList(int num) { List<Integer> list = new ArrayList<Integer>(); while (num > 0) { int n = num % 10; list.add(n); num = num / 10; } return list; }
得出结果 x=192 y=384 z=576 --------------------------- x=219 y=438 z=657 --------------------------- x=273 y=546 z=819 --------------------------- x=327 y=654 z=981 ---------------------------
|
|
返回顶楼 | |
发表时间:2010-07-21
jxdncsl 写道
写道
第二个:用程序实现不了,但总结了三点规律:
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 分析出错了, public static void main(String[] args) { for (int x = 123; x < 387; x++) { TreeSet<Integer> ts = new TreeSet<Integer>(); ts.addAll(getNumList(x)); ts.addAll(getNumList(2 * x)); ts.addAll(getNumList(3 * x)); if ("[1, 2, 3, 4, 5, 6, 7, 8, 9]".equals(ts.toString())) { System.out.println("x=" + x); System.out.println("y=" + 2 * x); System.out.println("z=" + 3 * x); System.out.println("---------------------------"); } } } private static List<Integer> getNumList(int num) { List<Integer> list = new ArrayList<Integer>(); while (num > 0) { int n = num % 10; list.add(n); num = num / 10; } return list; }
得出结果 x=192 y=384 z=576 --------------------------- x=219 y=438 z=657 --------------------------- x=273 y=546 z=819 --------------------------- x=327 y=654 z=981 ---------------------------
百位也呈递增关系就对了。 |
|
返回顶楼 | |
发表时间:2010-07-21
<? for($i=100;$i<=999;$i++){ if(!chk($i)) continue; $j = $i*2; if ($j>999) continue; $k = $i*3; if($k>999) continue; $str = $i.$j.$k; if (!chk($str)) continue; else echo $i." ".$j." ".$k."<br />"; } function chk($str){ if(strpos($str,'0')) return false; $ar = array(1,2,3,4,5,6,7,8,9); foreach ($ar as $v) { if (substr_count($str,$v) >1) return false; } return true; } ?> 结果: 192 384 576 219 438 657 273 546 819 327 654 981 |
|
返回顶楼 | |
发表时间:2010-07-21
最后修改:2010-07-21
第二个
import java.util.Arrays; public class test { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub int[] nums = new int[10]; for (int i = 123; i <= 329; i++) { Arrays.fill(nums, 0); if(test.check(i, nums)) if(test.check(i*2,nums)) if(test.check(i*3, nums)) System.out.println(i + ","+i*2+","+i*3); } } public static boolean check(int checkNum,int[] nums) { for (int j = 1; j <=3; j++) { int poiNum = checkNum%10; checkNum = checkNum/10; if(nums[poiNum]==1) { return false; } else { nums[poiNum]=1; } } return true; } } |
|
返回顶楼 | |
发表时间:2010-07-21
最后修改:2010-07-21
这结果对不
for(int i=102 ;i<329;i++) { String numStr = String.valueOf(i)+String.valueOf(i*2)+String.valueOf(i*3); Set charSet = new HashSet(); for(char ch : numStr.toCharArray()) charSet.add(ch); if(charSet.size() == numStr.toCharArray().length) System.out.println(i+" "+i*2+" "+i*3); } |
|
返回顶楼 | |
发表时间:2010-07-21
1.逆波兰表达式 2.代码如下: public static void main(String[] args) { int m = 0; int n = 0; String str = null; for(int i=123;i<345;i++){ m = i*2; n = i*3; str = "" + i + m + n; byte[] b = str.getBytes(); Arrays.sort(b); str = new String(b); if("123456789".equals(str)){ System.out.println(i + ";" + m + ";" + n); } } } 测试结果: 192;384;576 219;438;657 273;546;819 327;654;981
|
|
返回顶楼 | |