华为最新上机题(自己C实现代码)

时间:2022-06-30 18:49:46

年级群里面发出三道华为的机试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;
}

 华为最新上机题(自己C实现代码)

华为最新上机题(自己C实现代码)

图为最新做过的华为笔试题目

其中开头两道比较随意,单链表翻转其实也该随意,但是链表没怎么操作过不免有些紧张

参考之下 写一个留个纪念

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;

}