华为2018软件岗笔试题解题思路和源代码分享
2017年9月26日,参加了华为技术有限公司的笔试,题目类型是软件题,没有选择填空问答类型,总共是3道编程题目,题目难度适中,在两个小时内完成3道题目的AC,所以分享的代码都是可运行且完全AC的! 和广大网友分享,相互交流提高。
***********************************************
题目描述
输入两个字母串,将两个字母串都包含的字母用'_'替换后,输出两个字母串的剩余部分。
输入描述:
输入两个字符串,字符串最大长度为100。字符串只包含字母,不可能为空串,区分大小写。
输出描述:
按字符串顺序输出处理后的字符串
示例1
输入
abcd
bdef
输出
a_c_
__ef
解题思路:对输入的两个字符串分别建立ASCII字符顺序的hash表,hash表默认为0,遍历一次字符串,每出现一个字符对应的hash表加1,可以得到包含字符出现次数的hash表。在输出时,对字符串中的每一个字符根据两个hash表判断是否在两个字符串都包含,如果是用'_'替换,否则输出原字符。
程序链接: https://github.com/wylloong/TinyPrograms/blob/master/Coding%20Interviews/HW_ReplaceSameCharsAs_ (同步更新)
***********************************************
题目描述
一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序根据输入的ISBN号码的前3段,计算出识别码,并输出完整的ISBN码。
输入描述:
为一个ASCII字符串。内容为ISBN码的前三段,以上面为例,就是0-670-82162。
输出描述:
若判断输入为合法的字符串,则计算出识别码,并输出完整的ISBN码;
若输入不合法,则输出字符串”ERROR”;
示例1
输入
0-670-82162
输出
0-670-82162-4
解题思路:实现功能难度较低,注意异常输入和边界值。先判断输入的字符串是否合法,合法后分解字符串为字符保存到数组中,然后根据公式依次计算字符的乘积,最后取余,但是需要注意10的输出具有特殊性!
程序链接: https://github.com/wylloong/TinyPrograms/blob/master/Coding%20Interviews/HW_ISBNCheckCode.cpp
***********************************************
题目描述
主机名由多级域名组成,自右向左,依次是顶级域名、二级域名、三级域名…..以此类推
例,主机名:google.com.hk
hk是顶级域名
com是二级域名
google是三级域名
现在我们需要实现一个主机名的排序功能
排序规则
1)主机名按照域名等级排序,即先按照顶级域名排序,顶级域名相同的再按照二级域名排序,顶级和二级域名均相同的再按照三级域名排序,以此类推,直到整个主机名排序完毕
2)如果短主机名是由长主机名从顶级域名开始的连续一个或多个域名组成,短主机名排在长主机名前面。例:google.com 排在 gmail.google.com 之前
3)每一级域名按照字典顺序排序,字典顺序定义见下页
输入确保符合以下规则(无需检查)
1)主机名以字符串形式给出,非空串
2)主机名中仅包含小写英文字母和分隔符’.’
3)主机名中没有连续的’.’,不以’.’开始,也不以’.’结束
3)主机名不存在重复
1、两个单词(字母按照自左向右顺序)先以第一个字母作为排序的基准,如果第一个字母相同,就用第二个字母为基准,如果第二个字母相同就以第三个字母为基准。依此类推,如果到某个字母不相同,字母顺序在前的那个单词顺序在前。
例:abc 排在 abf 之前
2、如果短单词是长单词从首字母开始连续的一部分,短单词顺序在前。
例:abc 排在 abcd 之前
输入描述:
不超过255个字符的字符串,不同的域名间用字符'|'进行分隔。
输出描述:
排序后的的域名,域名间用字符'|'进行分隔。
示例1
输入
mail.huawei.com|huawei.com|teltalk.org|google.com.hk|imail.huawei.com
输出
huawei.com|imail.huawei.com|mail.huawei.com|google.com.hk|teltalk.org
解题思路:首先根据“|”字符来分割输入域名字符串,保存到list中。结合插入排序的思想,针对每一个域名根据‘,’分隔,然后依次和已经排好序的域名序列比较,直到找到符合条件的位置,即大于已排序域名序列的前者,小于后者,插入到排序好的域名序列中,完成域名的排序!
程序链接: https://github.com/wylloong/TinyPrograms/blob/master/Coding%20Interviews/HW_DomainNameRanking.py