今天百无聊赖之时, 漫心看到14年的华为校招机试题目, 一共三道, 前两道皆是平平, 第三道却柳暗花明, 让人眼前一亮。 咋一看, 饶有趣味, 看似平淡无奇, 然而却玄机颇深(对我这种弱渣而言)。(不过对于ACMer, 好像应该用基础算法, 就能解决!)
(然而我也只会基础的算法!!忏愧的紧!!!)。如果有幸被大神看到, 能指点我一两招, 不胜感激! 下面是题目和我的详细题解思路(可供巨巨一笑!嘿嘿!)。
2014年七月华为校招机试题目:
第三题:
输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。
1 2 3 4 5 6 7 8 9 = X
比如:
12-34+5-67+89 = 5
1+23+4-5+6-7-8-9 = 5
请编写程序,统计满足输入整数的所有整数个数。
输入: 正整数,等式右边的数字
输出: 使该等式成立的个数
样例输入:5
样例输出:21
我的详细解题思路
这个题目看似简单, 却又各种细节情况需要考虑。 (可能是由于博主太菜, 暂时无法想出巧妙或高级的算法----本人大一, 路漫漫其修远兮!) 。 对待这个问题, 先是要求出, 共分成了几个数(最多9个, 最少1个)。 假设我们都把它分成9 个数,用数组num【】把它们存起来, 当然 如果这个数较靠后, 没分到数, 则对应 num【i】 = 0, 并且num【i+1】也一定为0;。 好啦!现在假设我们已找到了这个数组num的9 个值。 怎么求出这9个数(当然9个数里面大都是有0的)如何进行加减才能的到目标值呢? 当然我这种弱渣的笨方法是枚举出所有结果 进行一个一个的和目的值 x 进行比对。如何枚举出所有结果呢?因为只有两种运算符, 自然地想到二叉树,(可以定义向左为减,则向右为加) 令第一个数为 根节点 , 叶子即为枚举值。 树深的确定与num【i】的值有关, 例如 num【7】 != 0, num【8】 = 0; 则树深为7 。
对于上面的如何把1-9 分为九个数的问题, 博主实在太弱, 没有巧妙简洁地分法(即枚举), 只能用 9 个循环 去分。 不过所幸每层循环都在递减, 最大的为 9 。 所以时间复杂度并不高, 耗时并不太大。 然而对此问题我的代码竟然写了80多行, 实在不能容忍!。(相信你们也不会有兴趣看我的渣代码)。 等博主功力提升, 再用高效(精简)代码狂破此题!(我一直感觉此题有较好的算法可破)。 对于此题, 博主自我感觉自己弱爆啦!(其实是“爆了还弱”--弱爆了还继续弱!!!)。 但是博主不能容忍贴出又烂又长的代码! 敬请见谅。