论坛首页 招聘求职论坛

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

浏览 31619 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-21  
哈哈,想到上面的方法了,,,,,传说java7有闭包,那就简单了吧
0 请登录后投票
   发表时间: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.


分析得很好,佩服!
1 请登录后投票
   发表时间:2010-07-21  
wanghe 写道
   ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");

        System.out.println(jse.eval("1+2*3+6-2/2"));

这得引用js的引擎包啊
1 请登录后投票
   发表时间:2010-07-21  
第一个题应该是考你栈的使用吧
1 请登录后投票
   发表时间: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
---------------------------

 

0 请登录后投票
   发表时间: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
---------------------------

 

百位也呈递增关系就对了。

1 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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;
	}
	
	

}
1 请登录后投票
   发表时间: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);
		}
1 请登录后投票
   发表时间: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

 

0 请登录后投票
论坛首页 招聘求职版

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