年级群里面发出三道华为的机试C语言题目,闲来无事做一下找找C的感觉,结果看似明了写起来却并非顺畅,挂出来,分享一下
实现环境VS2010,题目三未实现输出错误,题目在《c和指针》、《C程序编程》的课本上见过相似的,或者说就是操作指针
题目描述(60分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数:
void stringFilter(const char *pInputStr,long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
*/
/* main函数已经隐藏,这里保留给用户的测试入口,在这里测试你的实现函数,可以调用printf打印输出*/
/* 当前你可以使用其他方法测试,只要保证最终程序能正确执行即可 */
/* 该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响*/
#include "stdafx.h"
#include<stdio.h>
void stringFilter(const char *pInputStr,long lInputLen,char *pOutputStr);
int _tmain(int argc, _TCHAR* argv[])
{
char inputStr[]="abacacde";
long lInputLen=8;
char outputStr[8]={0};
stringFilter(inputStr,lInputLen,outputStr);
return 0;
}
void stringFilter(const char *pInputStr,long lInputLen,char *pOutputStr)
{
int sign[26];
for(int i=0;i<26;i++)
sign[i]=0;
char *pOutput=pOutputStr;
for(long i=0;i<lInputLen;i++)
{
if(sign[*(pInputStr+i)-97]==0)
{
*pOutput++=*(pInputStr+i);
sign[*(pInputStr+i)-97]=1;
}
}
*pOutput='\0';
printf("%s",pOutputStr);
}
/*
题目描述(40分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
要求实现函数:
void stringZip(const char *pInputStr, longlInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp”输出:“8p”
*/
#include "stdafx.h"
void stringZip(const char *pInputStr,long lInputLen, char *pOutputStr);
int _tmain(int argc, _TCHAR* argv[])
{
char inputStr[]="xxxyyyyyyz";
char outputStr[10]={0};
stringZip(inputStr,10,outputStr);
return 0;
}
void stringZip(const char *pInputStr,long lInputLen,char *pOutputStr)
{
char previousChar='\0';
bool mark=false;
char *pTemp=pOutputStr;
for(int i=0;i<lInputLen;i++)
{
if(previousChar=='\0')
{
/**pTemp='1';
pTemp++;*/
*pTemp=*pInputStr;
previousChar=*pInputStr;
}
else if(*(pInputStr+i)==previousChar)
{
if(!mark)
{
*(pTemp+1)=*pTemp;
*pTemp='2';
pTemp++;
mark=true;
}
else
{
++(*(pTemp-1));
}
}
else
{
*(++pTemp)=*(pInputStr+i);
previousChar=*(pInputStr+i);
mark=false;
}
}
*(++pTemp)='\0';
printf("%s",pOutputStr);
}
/*
题目描述(50分):
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
要求实现函数:
void arithmetic(const char *pInputStr, longlInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
*/
#include "stdafx.h"
void arithmetic(const char *pInputStr,long lInputLen,char *pOutputStr);
int _tmain(int argc, _TCHAR* argv[])
{
char inputStr[]="4 - 7";
char outputStr[5]={0};
arithmetic(inputStr,5,outputStr);
return 0;
}
void arithmetic(const char *pInputStr,long lInputLen,char *pOutputStr)
{
int firstParam,secondParam,result;
firstParam=secondParam=0;
char arithOperator;
int count=0;
bool mark=false;
char space=32;
char *outputStr=pOutputStr;
while(*(pInputStr+count)!=space)
{
firstParam+=firstParam*10+(*(pInputStr+count)-'0');
count++;
}
count++;
arithOperator=*(pInputStr+count);
count+=2;
while(count<lInputLen)
{
secondParam+=secondParam*10+(*(pInputStr+count)-'0');
count++;
}
switch(arithOperator)
{
case '+':
result=firstParam+secondParam;
break;
case'-':
result=firstParam-secondParam;
break;
}
if(result<0)
{
*outputStr++='-';
result=-result;
}
if(result/100>0)
{
*outputStr++=result/100+'0';
result/=100;
mark=true;
}
if(result/10>0)
{
*outputStr++=result/10+'0';
*outputStr++=result%10+'0';
}
else
{
if(mark)
{
*outputStr++='0';
}
*outputStr++=result%10+'0';
}
*outputStr='\0';
printf("%s",pOutputStr);
}
1. 删除字符串中所有给定的子串(40分)
问题描述:
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数:
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
【输入】 str:输入的被操作字符串
sub_str:需要查找并删除的特定子字符串
【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果
【返回】 删除的子字符串的个数
注:
I、 子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:
在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果
匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。
II、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例
输入:str = "abcde123abcd123"
sub_str = "123"
输出:result_str = "abcdeabcd"
返回:2
输入:str = "abcde123abcd123"
sub_str = "1234"
输出:result_str = "abcde123abcd123"
返回:0
#include "stdafx.h"
int delete_sub_str(const char *str,const char *sub_str,char *result_str);
int _tmain(int argc, _TCHAR* argv[])
{
char str[]="abcde123abcd123";
char sub_str[]="123";
char result_str[10]={0};
int count=delete_sub_str(str,sub_str,result_str);
printf("count=%d, result_str:%s",count,result_str);
return 0;
}
int delete_sub_str(const char *str,const char *sub_str,char *result_str)
{
const char *pstr=str;
const char *psub_str=sub_str;
char *presult_str=result_str;
int count=0;
while(*pstr)
{
int no=0;
const char *tpstr=pstr;
const char *tpsub_str=psub_str;
while(*tpstr++==*tpsub_str++&&*tpsub_str!='\0'&&*tpstr!='\0')
no++;
if(*tpsub_str=='\0')
{
count++;
pstr+=no+1;
}
else
{
*presult_str++=*pstr;
pstr++;
}
}
*presult_str='\0';
return count;
}
图为最新做过的华为笔试题目
其中开头两道比较随意,单链表翻转其实也该随意,但是链表没怎么操作过不免有些紧张
参考之下 写一个留个纪念
void converse(ListNode **head)
{
ListNode *pPrevious,*pCurrent,*pLatter;
pPrevious=*head;
pCurrent=(*head)->nest;
while(pCurrent!=NULL)
{
pLatter=pCurrent->nest;
pCurrent->nest=pPrevious;
pPrevious=pCurrent;
pCurrent=pLatter;
}
(*head)->next=NULL;
*head=pPrevious;
}