华为机试 2013

时间: 2023-12-21 admin IT培训

华为机试 2013

华为机试 2013

1. 字串转换
问题描述:
将输入的字符串(字符串仅包含小写字母'a'到'z'),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;
若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;
当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
要求实现函数:
void convert(char *input,char* output)
【输入】 char *input , 输入的字符串
【输出】 char *output ,输出的字符串
【返回】 无

一个用来判断 是否与上一个相同,一个用来判断是否多于2个 

/*
14. 字串转换
问题描述:
将输入的字符串(字符串仅包含小写字母'a'到'z'),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;
若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;
当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
要求实现函数:
void convert(char *input,char* output)
【输入】 char *input , 输入的字符串
【输出】 char *output ,输出的字符串
【返回】 无一个用来判断 是否与上一个相同,一个用来判断是否多于2个 
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 100void convert(char *input,char* output)
{int len,f,i;char temp;char *p=output;len=strlen(input);f=0;//f=1表示才1个,f=0表示有2个以上相同 for(i=0;i<len;i++){if(input[i]!=temp){*p=(input[i]-'a'+1)%26+'a';p++;temp=input[i];f=1;}else{if(f==1){*p=(input[i]-'a'+2)%26+'a';p++;temp=input[i];f=0;} else{*p=(input[i]-'a'+1)%26+'a';p++;temp=input[i];f=1;}}}*p='\0';
}
int main()
{char input[N],output[N];while(scanf("%s",input)!=EOF){convert(input,output);printf("%s\n",output);}return 0;
}
/*
aabbccdd
aaabbcccd
aaaaaaaa
abcdzzz
*/


2.问题描述:    
在给定字符串中找出单词
( "单词"由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,
如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,
(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;
如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,
请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
void my_word(charinput[], char output[])
【输入】 char input[], 输入的字符串
【输出】 char output[],输出的字符串
【返回】 无
示例
输入:charinput[]="some local buses, some1234123drivers" ,
输出:charoutput[]="drivers local buses some"
输入:charinput[]="%A^123 t 3453i*()" ,
输出:charoutput[]=""

/*
问题描述:    
在给定字符串中找出单词
( "单词"由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,
如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,
(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;
如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,
请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
void my_word(charinput[], char output[])
【输入】 char input[], 输入的字符串
【输出】 char output[],输出的字符串
【返回】 无
示例
输入:charinput[]="some local buses, some1234123drivers" ,
输出:charoutput[]="drivers local buses some"
输入:charinput[]="%A^123 t 3453i*()" ,
输出:charoutput[]=""
*/
#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
#include<set>
#include<cstring>
using namespace std;
#define N 100
char str[N][N];void my_word(char input[], char output[])
{int len,i,j,f,k;char temp[N];char *blank=" ";len=strlen(input);k=0;//分割字符串 for(i=0;i<len;i++){j=0;f=0;while((input[i]<='z'&&input[i]>='a')||(input[i]<='Z'&&input[i]>='A')){str[k][j++]=input[i];i++;f=1;}if(f==1){str[k][j++]='\0';k++;}}//排序 for(i=0;i<k;i++){for(j=1;j<k-i;j++){if(strlen(str[j-1])<strlen(str[j])) { strcpy(temp,str[j]); strcpy(str[j],str[j-1]); strcpy(str[j-1],temp); } }}//去重复 for(i=0;i<k;i++){for(j=i+1;j<k;j++){if(strcmp(str[i],str[j])==0) strcpy(str[j],"\0"); }}//复制到output f=0;//f==0表示没有单词 for(j=0;j<k;j++) { if(strlen(str[j])==1||strcmp(str[j],"\0")==0)continue;if(f==0) { strncpy(output,str[j],strlen(str[j])+1); f=1;} else { strcat(output,blank); strcat(output,str[j]); } } if(f==0)//没有单词,为了显示好看,输出@ 
//    	strcpy(output,blank);strcpy(output,"@");return ; 	
}int main()
{char input[N],output[N];while(gets(input)){my_word(input,output);printf("%s\n",output);}return 0;
}
/*
some local buses, some1234123drivers
%A^123 t 3453i*()
aaa aaa bb2b$asd
aa@aa@aa#
*/

3 正数减法 问题描述:   
   两个任意长度的正数相减,这两个正数可以带小数点,也可以是整数,请输出结果。 
输入的字符串中,不会出现除了数字与小数点以外的其它字符,不会出现多个小数点以及小数点在第一个字符的位置等非法情况,
所以考生的程序中无须考虑输入的数值字符串非法的情况。  
 详细要求以及约束: 
  1.输入均为正数,但输出可能为负数;  
  2.输入输出均为字符串形式;  
  3.如果输出是正数则不需要带符号,如果为负数,则输出的结果字符串需要带负号  
例如:2.2-1.1 直接输出为“1.1”,1.1-2.2 则需要输出为“-1.1”   
  4.输出的结果字符串需要过滤掉整数位前以及小数位后无效的0,小数位为全0的,直接输出整数位  
  例如相减结果为11.345,此数值前后均不可以带0,“011.345”或者“0011.34500”等等前后带无效0的均视为错误 输出。
  例如1.1-1.1结果为0.0,则直接输出0。 


要求实现函数:  void Decrease(char *input1, char*input2, char *output)  
【输入】 char *iinput1 被减数 char*nput2 减数   
【输出】 char *output 减法结果 
【返回】 无 示例  
输入:char *input1="2.2"  char *input2="1.1"  输出:char*output="1.1" 
输入:char *input1="1.1"  char *input2="2.2"  输出:char *output="-1.1" 

/*
3 正数减法 问题描述:   两个任意长度的正数相减,这两个正数可以带小数点,也可以是整数,请输出结果。 
输入的字符串中,不会出现除了数字与小数点以外的其它字符,不会出现多个小数点以及小数点在第一个字符的位置等非法情况,
所以考生的程序中无须考虑输入的数值字符串非法的情况。  详细要求以及约束: 1.输入均为正数,但输出可能为负数;  2.输入输出均为字符串形式;  3.如果输出是正数则不需要带符号,如果为负数,则输出的结果字符串需要带负号  
例如:2.2-1.1 直接输出为“1.1”,1.1-2.2 则需要输出为“-1.1”   4.输出的结果字符串需要过滤掉整数位前以及小数位后无效的0,小数位为全0的,直接输出整数位  例如相减结果为11.345,此数值前后均不可以带0,“011.345”或者“0011.34500”等等前后带无效0的均视为错误 输出。例如1.1-1.1结果为0.0,则直接输出0。 要求实现函数:  void Decrease(char *input1, char*input2, char *output)  
【输入】 char *iinput1 被减数 char*nput2 减数   
【输出】 char *output 减法结果 
【返回】 无 示例  
输入:char *input1="2.2"  char *input2="1.1"  输出:char*output="1.1" 
输入:char *input1="1.1"  char *input2="2.2"  输出:char *output="-1.1" 
*/
#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
#include<set>
#include<cstring>
using namespace std;
#define N 100void Decrease(char *input1, char*input2, char *output)  
{  int i;  int n1=0,n2=0; //小数点前 int m1=0,m2=0; //后 //1for(i=0;input1[i]!='.'&&input1[i]!='\0';i++)  ++n1;  if(input1[i]=='\0')  m1=0;       else  {  for(++i;input1[i]!='\0';i++)   ++m1;   }  //2for(i=0;input2[i]!='.'&&input2[i]!='\0';i++)  ++n2;  if(input2[i]=='\0')  m2=0;       else  {  for(++i;input2[i]!='\0';i++)   ++m2;   } int m3=(m1>m2?m1:m2),n3=(n1>n2?n1:n2);  int len=n3+m3;  char *s1=new char[len];  char *s2=new char[len];  char *s3=new char[len+1];  //小数点前 补0 for(i=0;i<n3;i++)  {  if(n1+i<n3)//n3-i表示剩余的 s1[i]='0';  else  s1[i]=input1[n1+i-n3];  if(n2+i<n3)  s2[i]='0';  else  s2[i]=input2[n2+i-n3];  } //小数点后 补0  for(i=n3;i<m3+n3;i++)  {  if(i-n3<m1)  s1[i]=input1[n1+1+i-n3];  else  s1[i]='0';  if(i-n3<m2)  s2[i]=input2[n2+1+i-n3];  else  s2[i]='0';  }  int k=0;  //表示正负 for(i=0;i<len;i++)  {  if(s1[i]>s2[i])  break;  else if(s1[i]<s2[i])  {  k=-1;  break;  }  }  int d=0;  if(k==-1)  {  for(i=0;i<len;i++)  {  swap(s1[i],s2[i]);  }  output[d++]='-';  }  k=0; //减法 for(i=len-1;i>=0;i--)  {  if((k+s1[i]-s2[i])>=0)  {  s3[i]='0'+k+s1[i]-s2[i];  k=0;  }  else  {  s3[i]='0'+10+k+s1[i]-s2[i];  k=-1;  }   }    //去除前面0 int start=0;  for(i=0;i<n3;i++)  {  if(start==0&&s3[i]=='0')  continue;  start=1;  output[d++]=s3[i];  }  if(start==0)  output[d++]='0';  //去除后面0  start=0;  for(i=len-1;i>n3-1;i--)  {  if(start==0&&s3[i]=='0')  continue;  start=1;  break;  }  //复制小数点后 int a1=i;  if(start==0)  {  output[d]='\0';  }  else  {  output[d++]='.';  for(i=n3;i<a1+1;i++)  output[d++]=s3[i];  output[d]='\0';  }  }  int main(void)  
{  char input1[N],input2[N];  char output[N];while(scanf("%s%s",input1,input2)!=EOF){Decrease(input1, input2, output);  cout<<output<<endl; }  return 0;  
}  
/*
1.1 2.2
2.2 1.1
1.1 22.2
22.2 1.1
1.1 12.12
12.12 1.1
1.1 1
1 1.1
1.12 1.12
1.03 12.99
*/