2014年七月华为校招机试题目--最难的一道, 呵呵!

今天百无聊赖之时, 漫心看到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多行, 实在不能容忍!。(相信你们也不会有兴趣看我的渣代码)。 等博主功力提升, 再用高效(精简)代码狂破此题!(我一直感觉此题有较好的算法可破)。 对于此题, 博主自我感觉自己弱爆啦!(其实是“爆了还弱”--弱爆了还继续弱!!!)。 但是博主不能容忍贴出又烂又长的代码!  敬请见谅。

时间: 2024-12-23 02:11:08

2014年七月华为校招机试题目--最难的一道, 呵呵!的相关文章

华为2016机试题目01

牛客网做的华为2016机试题目,新手,代码较乱,一起讨论. 题目要求如下: 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一

华为校招机试—传送门

华为机试-多个数的最大公约数 华为机试-算日期 华为机试-拼音翻译成阿拉伯数字(只有数字拼音) 华为机试-拼音翻译成阿拉伯数字(有Wan,Qian,Bai,Shi单位) 华为机试-输出大写字母 华为机试-亮着电灯的盏数(优化过的双重for) 华为机试-从考试成绩中划出及格线 华为机试-亮着电灯的盏数(1-N完全平方数的个数) 华为机试-大数相减 华为机试-姓名的夫妻相 华为机试-元素按奇偶排序 (金字塔) 华为机试-地铁换乘(图文吐血整理) 华为机试-"十七进制"转"十进制&

2016华为校招机试记录

3道题,分值100/200/300,都不算难 1.输入一个字符串,输出该字符串按照每个字母与'U'距离的绝对值排序的新字符串(若相同,按照原字符串中的位置关系排列) 核心就是写一个sort的cmp函数,没什么难度 2.续1s:给定一个字符串类型的时间(2016/09/13 13:13:13),输出下一秒的时间 考虑好闰年情况依次进位即可 3.仿自动售货机:给一个字符串(形如p 1,p 5,p 5,b A1,b A3,b A2)和执行前货箱.钱箱的初始状态,p k(1/2/5)表示塞入一张k元纸币

华为2016机试题目02

题目要求如下: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERR

华为2016机试题目03

题目描述如下: 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号. 处理: 1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加:(文件所在的目录不同,文件名和行号相同也要合并) 2.超过16个字符的文件名称,只记录文件的最后有效16个字符:(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并) 3.输入的文件可能带路径,记录文件名称不能带路径 输入描述: 一行或多行字符串.每行包括带路径文件名称,行号,以空格隔开.

华为OJ机试题目——24点游戏算法

对于这种题用程序实现只能是穷举的思想,而做法各异,如下代码是利用符号的不断变化,利用4个数计算值,默认是4个数字a,b,c,d是按顺序计算的,即默认是加了括号的,即(((a op1 b)op2 c)op3 d).而4个数字要组合顺序有A(4,4)=24种,很好理解,代码放在这里存档~ #include<iostream> using namespace std; /* (((aop[i]b)op[j]c)op[k]d) */ static char op[]={'+','-','*','/'}

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(

2015年华为校招机试题和代码实现(分解字符串,拼音转数字,去除重复字符并排序,等式变换)

再来一套2015年的华为机试题. 第一题(60分): 按要求分解字符串,输入两个数M,N:M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0.例如:输入2,8, "abc" ,"123456789",则输出为"abc00000","12345678","90000000" 分析思路: 容易题 1.获得字符串的长度length后,判断与要输出位数N的大小,大于N的话,直接printf前N位字符,然

Hua Wei 机试题目

一.身份证号码验证 题目描述: 我国公民的身份证号码特点如下:1. 长度为18位:2. 第1-17位只能为数字:3. 第18位可以是数字或者小写英文字母x.4. 身份证号码的第7~14位表示持有人生日的年.月.日信息.例如:511 002 1988 08 08 0111或51100219880808011x.请实现身份证号码合法性判断的函数.除满足以上要求外,需要对持有人生日的年.月.日信息进行校验.年份大于等于1900年,小于等于2100年.需要考虑闰年.大小月的情况.所谓闰年,能被4整除且不