您的位置:首页 > 其它

华为2016机试题目

2015-09-10 16:49 162 查看
昨天去华为南研机试=。=

故地重游 没啥感慨

题目很简单

第一题

输入一个字符串,输出其中字母、数字、空格、其他字符的个数

输入一个字符之后 直接比较就行

边界条件 也就是判断是否为空

核心代码如下

void countNumber(char* str, int& numOfLetter, int& numOfNumber, int& numOfSpace, int& numberOfOther)
{
if (str == NULL)
return;
int len = strlen(str);
for (int i = 0; i < len; i++)
{
if (str[i] >= 0 && str[i] < 256)
{
if (str[i]>= 'a' && str[i] <= 'z')
numOfLetter++;
else if (str[i] >= 'A' && str[i] <= 'Z')
numOfLetter++;
else if (str[i] >= '0' && str[i] <= '9')
numOfNumber++;
else if (str[i] == ' ')
numOfSpace++;
else
numberOfOther++;
}
}
}


然而这道题 我拿了0分(不要问我为什么 我想静静)

git 传送门

第二题

海边有m只猴子,一堆香蕉,第一只猴子将香蕉分成m堆多1个,扔掉多余的一个香蕉,并拿走一堆之后换第二只猴子

第二只猴子把剩余的香蕉分成m堆多一个,扔掉一个拿走一堆,换第三只、以此类推换第四只、第五只、第m只

问这堆香蕉开始时最少有几个

/* 3=<m<=9*/

很人性,大于10 之后 需要使用大数

先做一个很简单的推导 从后往前推

猴子编号起始数量剩余数量
1m*f1+1(m-1)*f1
2m*f2+1(m-1)*f2
3m*f3+1(m-1)*f3
4m*f4+1(m-1)*f4
所以只要满足 (m-1)*f(n)=m*f(n+1)+1 这个规律 就可以从1开始递增求解

递归也好 循环也好随意了

核心代码如下
int banana(int m, int min)
{
bool flag = true;
int rest = m * min + 1;
for (int i = m; i >1; i--)
{
if (0 == (rest % (m - 1)) )
rest = (rest / (m - 1))*m + 1;
else
{
flag = false;
break;
}
}
if (flag == false)
return banana(m, min + 1);
else
return rest;
}
PS:这道题 应该还有更快的方法 如果有朋友想到 欢迎大家一起探讨

git传送门

第三题

输入一个字符串,有两个不超过100位的大数 空格分开 取余

大数的操作 ,其实就是字符串的操作,思路也很简单,就是实现细节的问题

我的想法是 对于小数 不断左移(也就是 *10 *100 )

然后 大数-左移之后的小数

如此循环直到大数小于小数

PS 然而 实际实现的时候 我偷懒了 没左移 直接减了 以后有机会补上

git传送门
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: