设为首页 收藏本站
查看: 1410|回复: 0

[经验分享] 华为 机试题

[复制链接]

尚未签到

发表于 2016-6-6 07:14:24 | 显示全部楼层 |阅读模式
// MyC.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <assert.h>
#include <string.h>
#include <math.h>
/*
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”
*/
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
{
char cTmp = 0;
long lIdx = 0;
/* 输入参数判断 */
assert(NULL != pInputStr);
assert(NULL != pOutputStr);
if (0 == lInputLen)
{
return;
}
while ((lIdx < lInputLen) && (pInputStr[lIdx] != '\0')) /* 遍历输入字符串的字符 */
{
cTmp = pInputStr[lIdx++]; /*  */
unsigned int i = 0;
unsigned int uiOutputLen = strlen(pOutputStr);
while (i < uiOutputLen) /* 判断输出数组中是否存在相同的字符 */
{
if (cTmp == pOutputStr)
{
break;
}
i++;
}
if (i == uiOutputLen) /* 说明输出数组中没有相同的字符 */
{
pOutputStr = cTmp;
}
else
{
continue;
}
}
return ;
}
void stringFilter_test()
{
const char acInputStr[100] = "pppppppp";
char acOutputStr[100] = {0};
stringFilter(acInputStr, 100, acOutputStr);
printf("%s\n", acOutputStr);
}
/*
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
*/
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
/* 入参合法性判断 */
assert(NULL != pInputStr);
assert(NULL != pOutputStr);
if (lInputLen <= 0)
{
assert(0);
return ;
}
long lCount = 1;         /* 相同字符计数器 */
long lIdx = 1;           /* 从第1个字符开始遍历,0表示字符数组起始 */
long lOutputIdx = 0;
char cTmp;
while (lIdx < lInputLen) /* 遍历输入字符串 */
{
cTmp = pInputStr[lIdx];
if (cTmp == pInputStr[lIdx - 1]) /* 与前一个值进行比较 */
{
lCount++;
}
else
{
if (lCount > 1)  /* 判断重复字符的格式,只有重复字符大于1才能进行压缩 */
{
pOutputStr[lOutputIdx++] = (char)lCount+'0'; /* 数字转换为字符 */
pOutputStr[lOutputIdx++] = pInputStr[lIdx - 1];
}
else
{
pOutputStr[lOutputIdx++] = pInputStr[lIdx - 1];
}
lCount = 1; /* 重新初始化计数器 */
if (pInputStr[lIdx] == '\0') /* 如果输入字符串结束,则跳出循环 */
{
break;
}
}
lIdx++ ;
}
return ;
}
void stringZip_test()
{
const char acInputStr[100] = ""; //pppppppp  cccddecc
char acOutputStr[100] = {0};
stringZip(acInputStr, 100, acOutputStr);
printf("%s\n", acOutputStr);
}

/*
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
本程序可以计算超出100的整数。
*/
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)
{
/* 入参合法性判断 */
assert(NULL != pInputStr);
assert(NULL != pOutputStr);
if (lInputLen <= 0)
{
assert(0);
return ;
}
long lIdx = 0;
long lTmp = 0;
int iOp1Num = 0;
int iOp2Num = 0;
char cOp = 0; /* 运算符 */
/* 取出第一个操作数 */
while (pInputStr[lIdx] != ' ') /* 计算lIdx,使其定位到第一个空格处 */
{
lIdx++;
}
while (lTmp < lIdx)
{
iOp1Num += (pInputStr[lTmp] - '0') * (int)pow(10.0,(lIdx - lTmp - 1));
lTmp++;
}
printf("Op1 %d\n", iOp1Num);
/* 取出操作符 */
lTmp = lIdx;
lIdx++;
while (pInputStr[lIdx] != ' ') /* 计算lIdx,使其定位到第二个空格处 */
{
lIdx++;
}
if ((lIdx - lTmp) > 2)
{
printf("Input param error. \n");
return ;
}
else if ((lIdx - lTmp) == 2)
{
cOp = pInputStr[lIdx - 1];
}
printf("Op %c\n", cOp);
/* 取出第二个操作数 */
lTmp = lIdx;
while (pInputStr[lIdx] != '\0') /* 计算lIdx,使其定位到输入字符串的最后 */
{
lIdx++;
}
lTmp++;
while (lTmp < lIdx)
{
iOp2Num +=  (pInputStr[lTmp] - '0')  * (int)pow(10.0, lIdx - lTmp -1);
lTmp++ ;
}
printf("Op2 %d\n", iOp2Num);
int iResult = 0;
switch (cOp)
{
case '+':
{
iResult = iOp1Num + iOp2Num;
break;
}
case '-':
{
iResult = iOp1Num - iOp2Num;
break;
}
default:
assert(0);
}
printf("iResult = %d\n", iResult);
/* 先翻转结果值 */
int iRetTmp = 0;
while (iResult)
{
iRetTmp *= 10;
iRetTmp += iResult % 10;
iResult /= 10;
}
printf("iRetTmp = %d\n", iRetTmp);
/* 将计算结果写入输出字符数组中 */
int iOutputIdx = 0;
while (iRetTmp)
{
pOutputStr[iOutputIdx++] = (iRetTmp % 10 + '0'); /* 注意需要将整数转换为字符哦 */
iRetTmp /= 10;
}

return;
}
void arithmetic_test()
{
const char acInputStr[100] = "22 + 3"; //99 ++ 77   22 + 3
char acOutputStr[100] = {0};
arithmetic(acInputStr, 100, acOutputStr);
printf("%s\n", acOutputStr);
}

int _tmain(int argc, _TCHAR* argv[])
{
//stringZip_test();
arithmetic_test();
return 0;
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-226753-1-1.html 上篇帖子: 华为笔试(一) 下篇帖子: 华为-IT管理类
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表