答复: 深圳两个上机题,做了三小时!(小弟处女贴,求讨论)

[quote="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

请教大家评论及指点! [/quote]


首先,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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值