论坛首页 招聘求职论坛

深圳两个上机题,求讨论!

浏览 31334 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-20   最后修改:2011-04-19
第一个:写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。如:传递表达式"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

请教大家评论及指点!
   发表时间:2010-07-20  
第二个数是第一个数的两倍,第三个数是第一个数的三倍,用程序实现。
何必什么规律呢。。
这么小的数字,直接用穷举就行了。
从100--333,把他们×2,×3.连成一个数字串。判断是否满足,满足就打印,不满足就pass。。
1 请登录后投票
   发表时间:2010-07-21   最后修改:2010-07-21
1.第一个题目,是否带“()” 如果不带括号,很好办。。我就不多说了
2.乍一看有点难度,想清楚就不男了  9个数1-9组成三个数 第二个数是第一个数的两倍,第三个数是第一个数的三倍 由此可见 第一个数 只能是 321  第二个数 便是 624, 第三个数 936, 。。。不晓得是你描述错误,还是我想错了。。。第二个题目有意义么?
0 请登录后投票
   发表时间:2010-07-21  
第一个:

先写一个方法,处理无括号简单表达式的计算结果

先计算简单表达式 的 乘法和除法,然后计算加法减法

再写目标方法,去除所有括号(既利用上面写的这个方法先计算出括号里面的表达式的结果),去除所有括号后即得到简单表达式,再用上面写的方法计算出结果

第二个:

用程序实现不了?先不考虑算法,直接用最笨的办法

1-9的所有排列 ( 1 跟 2-9 换位置,2 跟 3-9换位置,3 跟 4-9 换位置...)

1-9 的所有排列可能 的 遍历  -->  判断 三个数的倍数关系  --> 得到结果

或者,

1-9 遍历 所有 三位数

如 123,然后 得出 123 的 两倍  246 和 三倍 369 , 判断为 false
然后 132, 得出  264 和 396 ,判断为 false,
...
直到 得到 true




0 请登录后投票
   发表时间:2010-07-21   最后修改:2010-07-21
第一个,逆波兰表达式
http://leon-a.iteye.com/blog/186104

第二题,由于java在1秒内运算的数量级大概是10^9,所以纯暴力就可以了
package test;

public class Main {

	String[] nums = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
	boolean[] visable = new boolean[] { false, false, false, false, false,
			false, false, false, false };

	public void check() {
		for (int i = 0; i < nums.length; i++) {
			for (int j = 0; j < nums.length; j++) {
				for (int k = 0; k < nums.length; k++) {
					if (!nums[i].equals(nums[j]) && !nums[i].equals(nums[k])
							&& !nums[j].equals(nums[k])) {
						Integer num = new Integer(nums[i] + nums[j] + nums[k]);
						Integer num2 = num * 2;
						Integer num3 = num * 3;
						visable[i] = true;
						visable[j] = true;
						visable[k] = true;
						String str = num2.toString() + num3.toString();
						if (str.length() == 6) {
							if (isUnique(str)) {
								System.out.println(num + "," + num2 + ","
										+ num3);
							}
						}
						resetVisable();
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		Main m = new Main();
		m.check();
	}

	public void resetVisable() {
		for (int i = 0; i < visable.length; i++) {
			visable[i] = false;
		}
	}

	public boolean isUnique(String str) {
		String[] strs = str.split("");
		for (int i = 1; i < strs.length; i++) {
			int k = 0;
			for (int j = 0; j < nums.length; j++) {
				if (strs[i].equals(nums[j])) {
					if (!visable[j]) {
						visable[j] = true;
					} else {
						return false;
					}
				} else {
					k++;
				}
			}
			if (k == nums.length) {
				return false;
			}
		}
		return true;
	}

}
1 请登录后投票
   发表时间:2010-07-21  
leon_a 写道
第一个,逆波兰表达式
http://leon-a.iteye.com/blog/186104

第二题,由于java在1秒内运算的数量级大概是10^9,所以纯暴力就可以了
package test;

public class Main {

	String[] nums = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
	boolean[] visable = new boolean[] { false, false, false, false, false, false, false, false, false };

	public void check() {
		for (int i = 0; i < nums.length; i++) {
			for (int j = 0; j < nums.length; j++) {
				for (int k = 0; k < nums.length; k++) {
					if (!nums[i].equals(nums[j]) && !nums[i].equals(nums[k]) && !nums[j].equals(nums[k])) {
						Integer num = new Integer(nums[i] + nums[j] + nums[k]);
						Integer num2 = num * 2;
						Integer num3 = num * 3;
						visable[i] = true;
						visable[j] = true;
						visable[k] = true;
						String str = num2.toString() + num3.toString();
						if (str.length() == 6) {
							if (isUnique(str)) {
								System.out.println(num + "," + num2 + "," + num3);
							}
						}
						resetVisable();
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		Main m = new Main();
		m.check();

	}

	public void resetVisable() {
		for (int i = 0; i < visable.length; i++) {
			visable[i] = false;
		}
	}

	public boolean isUnique(String str) {
		String[] strs = str.split("");
		for (int i = 0; i < strs.length; i++) {
			for (int j = 0; j < nums.length; j++) {
				if (strs[i].equals(nums[j])) {
					if (!visable[j]) {
						visable[j] = true;
					} else {
						return false;
					}

				}
			}
		}
		return true;
	}

}




逆波兰表达式,怀念啊,读书的时候根本不知道这个有什么用
0 请登录后投票
   发表时间:2010-07-21  
eval飘过……
2 请登录后投票
   发表时间:2010-07-21  
第一题有很多种方法啊。
1.用jexl
2.用javacc
3.自已解析啊。定义一堆优先级,然后压栈处理咯
0 请登录后投票
   发表时间:2010-07-21  
好像曾经的数据结构考试。。。
0 请登录后投票
   发表时间:2010-07-21  
别纯暴力,起码剪个枝:
最简单限定一下百位就省下不少运行时间了
1 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics