华为OJ之中级篇Ⅰ
来源:互联网 发布:mysql 开启慢日志 编辑:程序博客网 时间:2024/06/05 15:58
前言
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.查找兄弟单词
实现一个可存储若干个单词的字典。用户可以:
由小写英文字母组成,不含其它字符。
兄弟单词
给定一个单词X,如果通过任意交换单词中字母的位置得到不同的单词Y,那么定义Y是X的兄弟单词。
字典顺序
两个单词(字母按照自左向右顺序),先以第一个字母作为排序的基准,如果第一个字母相同,就用第二个字母为基准,如果第二个字母相同就以第三个字母为基准。依此类推,如果到某个字母不相同,字母顺序在前的那个单词顺序在前。如果短单词是长单词从首字母开始连续的一部分,短单词顺序在前。
举例:bca是abc的兄弟单词;abc与abc是相同单词,不是兄弟单词
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
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.字符串基本操作
用例中可以使用中提供的库函数。
实现接口,每个接口实现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.字节流解析
详细描述:
接口说明
原型:
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.最大递减数
9.可怕的阶乘
详细描述:
接口说明
原型:
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”。
答案点这里
- 华为OJ之中级篇Ⅰ
- 华为OJ之中级篇Ⅱ
- 华为oj之【中级】单词倒排
- 华为oj中级 笔画
- 华为oj中级 线性插值
- 华为oj中级 【中级】单词倒排
- 华为oj--中级--购物单
- 华为OJ 中级:字符串排序
- 华为OJ 中级:汽水瓶
- 华为OJ题解(中级)
- 华为OJ 中级 字符串排序
- 华为oj中级 购物单
- 华为oj中级 坐标移动
- 华为oj中级 汽水瓶
- 华为oj中级 字符串排序
- 华为oj中级 素数伴侣
- 华为oj中级 迷宫问题
- 华为oj中级 Sudoku-Java
- [Lintcode] Best Time to Buy and Sell Stock IV
- 第十二周程序填空
- jni.h
- ios学习笔记:UIView设置为圆角
- JSTL 的 if else : 有 c:if 没有 else 的处理
- 华为OJ之中级篇Ⅰ
- libcurl教程(转)
- Android ANR错误排查
- sublime快捷键
- UIView的一般操作 - iOS - UI基础知识总结1
- ztree学习与使用
- Swift-可选类型(Optional)以及解包
- C++成员变量的初始化顺序问题
- 深入理解DIP、IoC、DI以及IoC容器