华为OJ之中级篇Ⅰ

前言

经过断断续续的刷题,终于在差不多一个月把50道初级题刷完了。在开始本部分的中级篇之前,简要谈谈初级篇的感受吧。初级篇中的题大部分实现的功能都比较简单,往往就考察一两个功能,换句话说测试用例比较好写,不是特别复杂。对于C/C++类型的题,我们只要按照给定的接口实现就行了,接口一定,很多东西都确定了。而对于“基于输入输出”类型的题真是被虐惨了,因为main函数的内容都要自己写,相比更灵活,但假如不满足机器验证的输入输出接口格式,那结果一定是不对的,虽然可能说算法是对的,但没办法,在某方面来说机器还是比较stupid的。然后如果提交结果错误,每提交一次错误扣2分,所以对于那些想追求“满分”的同学,还是在上传答案前,自己写写测试用例来验证一下吧,而不要依赖机器验证来判断结果是否正确,这种做法往往会令人抓狂。
对于中级篇,相比初级篇要实现的接口函数就更多了,测试用例也比较复杂。因此在做这一部分的题目时,一定要仔细分析输入输出接口呀、返回值呀等内容,否则还容易没有顾全全部,也就是会出现几个测试用例未通过的情况。

1.IP地址有效性判断

题目概述

题目标题:

判断输入的字符串是不是一个有效的IP地址

详细描述:

请实现如下接口

booli sIPAddressValid ( const char * pszIPAddr )

输入: pszIPAddr 字符串

输出:true 有效的IP地址,false,无效的IP地址

约束

输入IP为XXX.XXX.XXX.XXX格式

字符串两端含有空格认为是合法IP

字符串中间含有空格认为是不合法IP

类似于 01.1.1.1, 1.02.3.4 IP子段以0开头为不合法IP

子段为单个0 认为是合法IP,0.0.0.0也算合法IP


答案点这里


思路及小结

注意空格出现的位置,以及何时将数字字符串转换为数字。

2.查找兄弟单词

题目概述

实现一个可存储若干个单词的字典。用户可以:

在字典中加入单词。
查找指定单词在字典中的兄弟单词个数。
查找指定单词的指定序号的兄弟单词,指定序号指字典中兄弟单词按字典顺序排序后的序号(从1开始)
清空字典中所有单词。
单词
由小写英文字母组成,不含其它字符。
兄弟单词
给定一个单词X,如果通过任意交换单词中字母的位置得到不同的单词Y,那么定义Y是X的兄弟单词。
字典顺序
两个单词(字母按照自左向右顺序),先以第一个字母作为排序的基准,如果第一个字母相同,就用第二个字母为基准,如果第二个字母相同就以第三个字母为基准。依此类推,如果到某个字母不相同,字母顺序在前的那个单词顺序在前。如果短单词是长单词从首字母开始连续的一部分,短单词顺序在前。

举例: bcaabc的兄弟单词; abcabc是相同单词,不是兄弟单词

规格

0<=字典中所含单词个数<=1000

1<=单词所含字母数<=50

测试用例保证,接口中输入不会超出如上约束。


原型:int AddOneWord (char* Word);

功能:在字典中增加一个单词

输入参数: 

Word 单词字符串,调用者保证Word指针不为空,指向的是合法单词

输出参数:

返回值:

-1 失败(单词在字典中已存在等情况)

0 成功


说明: Word字符串可能在函数外被释放,请自行分配字符串中单词的存储空间。


原型: int FindSimilarWordNum (char* Word);
功能:查找指定单词在字典中的兄弟单词个数
输入参数:
Word 指定单词字符串,调用者保证Word指针不为空,指向的是合法单词
输出参数:

返回值:
返回指定单词在字典中的兄弟单词总个数。如果不存在兄弟单词,返回0


原型:int FindOneSimilarWord (char* Word, int Seq, char* SimilarWord);
功能:查找指定单词的指定序号的兄弟单词,指定序号指字典中兄弟单词按字典顺序(参见Page 3)排序后的序号(从1开始)
输入参数:
Word 指定单词字符串,调用者保证Word指针不为空,指向的是合法单词
Seq 指定序号(大于等于1)
输出参数:
SimilarWord 返回兄弟单词字符串,指针不为空,指向的内存由调用者预先分配,占51个字节长度,输出的兄弟单词必须紧跟’\0’结束。如果不存在指定序号的兄弟单词,输出空串。
返回值:
-1 失败(如果不存在指定序号的兄弟单词,返回失败)
0 成功

原型:void ClearAllWords(void);
功能:清空字典中所有单词
输入参数:

输出参数:

返回值:


答案点这里


思路及小结

采用单向链表实现,用插入法对新加入的单词进行排序,因此链表中的单词顺序即为字典顺序。排好序后,在实现查找兄弟单词时,比较省事儿。采用algorithm头文件中的sort函数对单词按照ascii值进行重排,然后判断是否为兄弟单词,比较方便。


3.求二叉树的深度和宽度

题目描述:求二叉树的宽度和深度

给定一个二叉树,获取该二叉树的宽度和深度。
例如输入

a

/ \

b c

/ \ / \

d e f g


返回3.

详细描述:

接口说明

原型:

int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight)

输入参数:

head 需要获取深度的二叉树头结点

输出参数(指针指向的内存区域保证有效):

pulWidth 宽度

pulHeight 高度

返回值:

0 成功

1 失败或其他异常

答案点这里

4.删除链表中的重复节点、剩余节点逆序输出

题目描述:
输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排。
要求实现函数:

void vChanProcess(strNode * pstrIn,strNode * pstrOut);
【输入】 pstrIn:输入一个不带头节点的单向链表
【输出】 pstrOut:删除内容重复的节点(重复的节点全部删除),剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请)。
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例
输入链表的内容依次为 6,7,8,8,9,10,6
则输出链表的内容依次应该是 10,9,7

5.Arrange an Array to Form a Smallest Digit

题目描述:
Question:
Input an array of positive integers, arrange the integers to form new digits, and output the smallest digit among all the new ones.

Input Example 1:
{2, 1}

Output Example 1:
12

Input Example 2:
{32, 321}

Output Example 2:
32132

Input Example 3:
{4589, 101,41425,9999}

Output Example 3:
1014142545899999;

Interface:
int smallestDigit(int a[],int nCount,char * strRst)

Function: Arrange digits in the input array to form a smallest digit.
Input: int a[]: an array of integers
int nCount: length of the array
char * strRst: returned value

Output: none
Return: o indicates success and -1 indicates exception. 


6.字符串基本操作

题目描述:字符串操作C语言提供了较多的库函数,本题目要求代码中不能使用字符串操作相关的库函数,可以使用malloc。
用例中可以使用中提供的库函数。
实现接口,每个接口实现1个基本操作:
unsignedintstrlenth(char*s):计算字符串的长度。

voidstrcopy(char**target,char*source):字符串拷贝,从source拷贝到target中。

intstrcompare(char*s,char*t):字符串比较,比较的原则:
对两个字符串的每个字符从左到右逐个比较,进行ASCⅡ比较,只要一个字符大,则整个字符大;
如果每个字符相等,但是其中一个字符串长度更长,则此字符串更大。
如果s>t,返回1;如果s==t,返回0;如果s

voidstrcombine(char**x,char*s,char*t):字符串连接,将字符串t接到s后面,并存储到x中。

voidstrcatch(char*s,unsignedintindex,unsignedintlenth,char**t):字符串截取,对字符串s中,从第index个字符开始,截取lenth长度的字符串,并把截取出来的字符串存储到t中。

boolstrsubstr(char*s,char*sub):子串查找,在字符串s中查找字符串sub是否存在,如果存在则返回1,否则返回0。

题目框架中有17个参考用例,其它用例请执行编写。

7.字节流解析

题目描述:根据数值占用BIT数,按顺序从输入字节流中解析出对应数值,解析顺序按输入数组astElement索引升序。
详细描述:
接口说明
原型:
voidDecode(unsignedintuiIutputLen,unsignedcharaInputByte[],unsignedintuiElementNum,ELEMENT_STRU astElement[]);
输入参数:
unsignedintuiIutputLen:字节数组(流)长度
unsignedcharaInputByte:字节数组(流)
unsignedintuiElementNum:解析数值个数
ELEMENT_STRU astElement[]:数值的结构数组指针,含义如下
Struct
{
unsignedintuiElementLength; //表示uiElementValue占用BIT数,范围1~32
unsignedintuiElementValue; //从字节流中按顺序解析的数值,用于输出
}ELEMENT_STRU;
输出参数(指针指向的内存区域保证有效):
参见上述ELEMENT_STRU中uiElementValue描述
返回值:
Void
举例:
输入:
字节数组长度uiIutputLen为2;
字节数组aInputByte[2]为{0x62, 0x80},对应二进制为“01100010 1 000 0000”;
解析数值个数uiElementNum为2;
数值[0]的值占4个bit,即astElement[0].uiElementLength = 4;
数值[1]的值占5个bit,即astElement[1].uiElementLength = 5;
输出:
数值[0]的值为6,二进制为“0110”,即astElement[0].uiElementValue = 6;
数值[1]的值为5,二进制为“0010 1”,即astElement[1].uiElementValue = 5。
涉及知识点:
C语言基础:BIT
性能要求:

圈复杂度要求:
这个不由出题者提供,由后续判题系统全局配置
如:函数圈复杂度低于10,类公函数小于20等
代码工程和用例:
C/C++:
VS2005代码工程
嵌入工程的CPPUNIT用例

8.最大递减数

题目描述:
给出一个正整数,找到这个正整数中包含的最大递减数。一个数字的递减数是指相邻的数位从大到小排列的数字。如: 95345323,递减数有:953,95,53,53,532,32, 那么最大的递减数为953。

9.可怕的阶乘

题目描述:
计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值。例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围。请设计一个程序,使其可以计算100以内的数的阶乘,结果用字符串的形式输出
详细描述:
接口说明
原型:
void CalcNN(int n, char *pOut)
输入参数:
int n 需要计算的阶乘数
输出参数:
char *pOut 结算结果,内存由调用者负责管理

10.整数相除

题目描述:
实现接口:

/***********************************************************************
Description : 整数相除。
Input : unsigned int dividend :被除数,取值为无符号整数。
unsigned int divisor: 除数,取值为无符号整数。
Output : Char *pResult : 运算结果。
Return Value : 0:成功; -1:失败;
***********************************************************************/
int IntegerDivision (unsigned int dividend,
unsigned int divisor,
Char *pResult);
说明:
Char *pResult的空间由调用者提供,结果中最多保存十位整数,五位小数,整数部分超出十位,返回失败;小数部分超出五位,四舍五入;
存储结果以字符串形式显示,整数和小数部分需加上小数点。如结果为2.05,则输出的结果为”2.05”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD机试是华为公司的在线笔试平台,用于选拔人才。根据题库的不同版本,2023年A、B版本的真题目录大致如下: 考点分类: 1. 数据结构与算法:包括数组、链表、栈、队列、树、图、排序算法、查找算法等。 2. 编程语言:主要考察C++或Java语言的基础知识,包括语法、数据类型、运算符、流程控制等。 3. 计算机网络:主要考察网络基础知识,包括HTTP、TCP/IP协议、网络安全等。 4. 操作系统:主要考察操作系统的基础知识,包括进程管理、内存管理、文件系统等。 5. 数据库:主要考察数据库基础知识,包括SQL语句的编写、数据库设计等。 6. 算法设计与分析:主要考察算法的设计思路和复杂度分析能力。 7. 编程综合能力:主要考察应聘者的编程能力和解决问题的能力,题目可能是一些综合性的编程题目。 在线OJ入口: 华为OD机试一般提供在线提交代码的平台,应聘者需要在平台上注册账号,并按照要求进行代码的提交与运行。具体的OJ入口链接将根据考试安排提供给应聘者,一般将在笔试前一段时间内向应聘者发送相关信息。 在进行华为OD机试的过程中,应聘者可以根据真题目录中的考点分类进行有针对性的复习和准备,熟悉相关知识点,并通过刷题进行练习来提高自己的编程能力和解题能力。希望以上信息能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值