华为OJ之初级篇Ⅰ

来源:互联网 发布:2016宏观经济数据分析 编辑:程序博客网 时间:2024/05/18 02:27

前言

本文章旨在提供一个互相学习和交流的平台,也作为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
答案点这里
0 0