华为OJ之初级篇Ⅰ
2016-06-17 15:00
232 查看
前言
本文章旨在提供一个互相学习和交流的平台,也作为OJ刷题这段时光的记录。本人非计算机科班出身,程序主要以实现功能性需求为主,暂不考虑性能、质量等因素。以下OJ题目顺序为成功通过机器验证的顺序,本篇题目全出自初级题系列。为了保证本文界面的简洁性,代码以代码片形式给出,见相关“答案点这里”链接。1.在字符串中找出连续最长的数字串
题目概述
请一个在字符串中找出连续最长的数字串,并把这个串的长度返回;如果存在长度相同的连续数字串,返回最后一个连续数字串;
注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串“1234”的长度就小于数字串“1359055”,如果没有数字,则返回空字符串(“”)而不是NULL!
答案点这里
思路及小结
遍历输入字符串的每个字符,遇到数字字符,即'0'-'9'之间的字符,记录下数字串的起始地址及长度len_tem,一段数字串结束后将起始地址及长度赋给str及len,将下一次保存的数字串长度tem_len与len相比较,保存长度较长的数字串起始地址及长度。遍历完之后,首先分配数字串大小为(len + 1)的空间,将保存的数字串复制到给空间后,若len为0,则将分配的空间赋为"",最后将该空间的地址赋给输出字符串。
2.对象管理器
题目概述
实现对象管理器功能,其中管理的对象有3个外部关键字,要求实现:
增加对象;
删除对象;
判断对象是否存在;
说明: 对象的三个外部关键字分别以KEY1,KEY2,KEY3表示。
对象的3个外部关键字KEY1,KEY2,KEY3, 其取值范围都为:0~65535;
对象总个数小于等于10000;
以上规格由用例保证。
答案1点这里 答案2点这里
思路及小结
答案1为容器方式实现,答案2用链表实现。该题实质为对c++中vector的基本操作或者说是c语言中链表的基本操作。当然用vector方式显得更为直观。
3.删除重复字符
题目概述
删除重复字符
给定一个字符串,将字符串中所有和前面重复多余的字符删除,其余字符保留,输出处理后的字符串。需要保证字符出现的先后顺序,并且区分大小写。
答案点这里
思路及小结
用一个bool型的数组表示字符的重复情况,该数组大小为129,使用前先全初始化为false,ascii码最大为127,因此129长度足够了,遍历输入字符串的每一个字符,若对应字符的状态为false,将其加到输出字符串中去,并将字符的bool状态置为true,下一次就不保存该字符了。
4.24点游戏算法
题目概述
给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
答案点这里
思路及小结
此题为第一个设计到较复杂算法的题,由于是4个操作数,3个运算符,将每一次运算看做一个单元,该单元的结果可能和下一个操作数用下一个运算符构成下一个单元,因此有三个单元,穷举所有可能的运算方式,包括加入括号的情况。具体分析如下:
假如操作数为a,b,c,d,操作符用_代替,其中a,b,c,d的顺序不固定(见实际代码实现过程),_可能取+、-、*、/。加入括号,总共有5种可能的运算方式情形:
1.((a_b)_c)_d
2.a_((b_c)_d)
3.(a_(b_c))_d
4.a_(b_(c_d))
5.((a_b)_(c_d))
根据上面的概念约定,一个单元(即程序中的函数)包括一个运算符及两个操作数,结果为运算结果。将该单元记为函数float oper(int f,float var1,float var2);因此上述5种情况的第一种可表示为:
float result = oper(f3,oper(f2,oper(f1,a,b),c),d);
其中,result为四个操作数运算后的结果,f1,f2,f3分别表示1中第一、二、三个"_"表示的运算符。2、3、4、5情况的表示以此类推。将result的结果和24进行比较,考虑到存在除法的情况,允许一定范围的误差。若result和24接近表示操作数a,b,c,d可构成24点,返回true,结束,在程序的结尾返回false,表示未找到。
以上算法非本人原创,根据一个24点网页小应用改编,点此进入,感兴趣可以参考一下其源码。
5.周期串问题
题目概述
如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3)。字符串的长度小于等于100,由调用者保证。
接口说明
原型:
int GetMinPeriod(char *inputstring);
输入参数:
char * inputstring:字符串
返回值:
int 字符串最小周期
答案点这里
思路及小结
先找周期。由于周期必然能被字符串长度整除,因此以1到字符串长度为因子,判断是否能被字符串长度整除,若可以整除,遍历输入字符串,判断是否周期性重复。
6.最后一个单词长度
题目概述
求输入字符串最后一个单词的长度,如hello world,返回5。
输入参数:
字符串,最大长度为128
返回值:
最后一个单词长度
答案点这里
思路及小结
从后往前找空格,然后输出空格之后字符长度。若未找到空格,输出字符串长度。
7.百分制成绩
简要描述:给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E输入:一个整数0-100以内
输出:一个字符,表示成绩等级
例如:输入:90
输出:A
答案点这里
8.阿姆斯特朗数
简要描述:如果一个正整数等于其各个数字的立方和,则该数称为阿姆斯特朗数(亦称为自恋性数),1除外,如407 = 43+03+73就是一个阿姆斯特朗数。试编程求n(n ≤ 65536)以内的所有阿姆斯特朗数。接口说明
原型:
int CalcArmstrongNumber(int n);
输入参数:
int n: n ≤ 65536
返回值:
n以内的阿姆斯特朗数的数量
答案点这里
9.查找同构数的数量
简要描述:找出1至n之间同构数的个数。同构数是这样一组数:它出现在平方数的右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数。详细描述:
接口说明
原型:
intSearchSameConstructNum(int n);
输入参数:
int n:查找1至n之间的全部同构数
返回值:
int:1至n之间同构数的个数
答案点这里
10.二维数组的列排序
简要描述:给出一个二维数组,请将这个二维数组按第i列(i从1开始)排序,如果第i列相同,则对相同的行按第i+1列的元素排序,如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列。如果第i列到最后一列都相同,则按原序排列。实现以下接口:
输入一个m*n 的整数数组,实现按规则排列,返回排列后的数组。
调用者会保证:
比如输入数组为:
1,2,3
2,3,4
2,3,1
1,3,1
按第二列排序:
输出:
1,2,3
2,3,1
1,3,1
2,3,4
答案点这里
相关文章推荐
- java技术论文
- vue-router
- android 羊角符号(¥)在不同手机上显示不同
- wordpress关闭更新提示
- O-C浮点数转化整数
- 树的操作(C++)
- 从输入 URL 到页面加载完成的过程中都发生了什么事情?
- 需要完成的在准备工作
- textfield
- 用Redis构建分布式锁
- 进程调度算法
- java技术论文
- 为Angularjs ngOptions加上index解决方案
- 帝国的余辉--at&t
- 创建oracle表空间
- Syntax features 语法特性(一)
- SpringMVC4整合CXF发布WebService
- 你不知道的parseInt
- node.js mongdb数据库启动
- 一个RabbitMQ调试工具