2015华为校招机试题

第一题(60分):
       按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
[cpp]  view plain  cop
  1. 转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/39253767  
  2. #include<iostream>  
  3. #include<cstdio>  
  4. using namespace std;  
  5.   
  6. void solve(char *str , int n , int len)  
  7. {  
  8.     int i , j , k , quotient , remainder;  
  9.     quotient = len / n;                //原字符串被分解的个数  
  10.     remainder = len - n * quotient;    //剩余的字符串的个数  
  11.   
  12.     for(i = 0 ; i < len ; i += n)  
  13.     {  
  14.         if(len - i < n)  
  15.         {  
  16.              k = n - len + i;  
  17.              for(j = i ; j < len ; ++j)  
  18.                  printf("%c" , str[j]);  
  19.              for(j = 0 ; j < k ; ++j)  
  20.                  putchar('0');  
  21.         }  
  22.         else  
  23.         {  
  24.             for(j = i ; j < i + n ; ++j)  
  25.                 printf("%c" , str[j]);  
  26.         }  
  27.         putchar(' ');  
  28.     }  
  29.     printf("\n");  
  30. }  
  31.   
  32. int main(void)  
  33. {  
  34.     int i , m , n , len;  
  35.     char str[1000];  
  36.   
  37.     while(scanf("%d %d", &m , &n) != EOF)  
  38.     {  
  39.         for(i = 0 ; i < m ; ++i)  
  40.         {  
  41.             scanf("%s" , str);  
  42.             len = strlen(str);  
  43.             solve(str , n , len);  
  44.         }  
  45.     }  
  46.     return 0;  
  47. }  
第一题:拼音转数字
输入是一个只包含拼音的字符串,请输出对应的数字序列。转换关系如下:
描述:      拼音        yi  er  san  si  wu  liu  qi  ba  jiu
      阿拉伯数字        1   2   3      4   5    6    7   8   9
输入字符只包含小写字母,所有字符都可以正好匹配

运行时间限制:无限制
内存限制:       无限制
输入:              一行字符串,长度小于1000
输出:              一行字符(数字)串
样例输入:       yiersansi
样例输出:       1234

[cpp]  view plain  copy
  1. 转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/39253767  
  2. #include<iostream>  
  3. #include<cstdio>  
  4. using namespace std;  
  5.   
  6. void solve(char *str , int len)  
  7. {  
  8.     int i;  
  9.   
  10.     for(i = 0 ; i < len ; )  
  11.     {  
  12.         switch(str[i])  
  13.         {  
  14.         case 'y':  
  15.             putchar('1');  
  16.             i += 2;  
  17.             break;  
  18.         case 'e':  
  19.             putchar('2');  
  20.             i += 2;  
  21.             break;  
  22.         case 's':  
  23.             if(str[i + 1] == 'a')  
  24.             {  
  25.                 putchar('3');  
  26.                 i += 3;  
  27.             }  
  28.             else  
  29.             {  
  30.                 putchar('4');  
  31.                 i += 2;  
  32.             }  
  33.             break;  
  34.         case 'w':  
  35.             putchar('5');  
  36.             i += 2;  
  37.             break;  
  38.         case 'l':  
  39.             putchar('6');  
  40.             i += 3;  
  41.             break;  
  42.         case 'q':  
  43.             putchar('7');  
  44.             i += 2;  
  45.             break;  
  46.         case 'b':  
  47.             putchar('8');  
  48.             i += 2;  
  49.             break;  
  50.         case 'j':  
  51.             putchar('9');  
  52.             i += 3;  
  53.             break;  
  54.         }  
  55.     }  
  56.     printf("\n");  
  57. }  
  58.   
  59. int main(void)  
  60. {  
  61.     int len;  
  62.     char str[1000];  
  63.   
  64.     while(scanf("%s" , str) != EOF)  
  65.     {  
  66.         len = strlen(str);  
  67.         solve(str , len);  
  68.     }  
  69.     return 0;  
  70. }  
第二题:去除重复字符并排序
运行时间限制:无限制
内容限制:       无限制
输入:              字符串
输出:              去除重复字符并排序的字符串
样例输入:       aabcdefff
样例输出:       abcdef
[cpp]  view plain  copy
  1. 转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/39253767  
  2. #include<iostream>  
  3. #include<cstdio>  
  4. #include<memory>  
  5. using namespace std;  
  6.   
  7. void solve(char *str , int len)  
  8. {  
  9.     int i , hash[256];  
  10.     memset(hash , 0 , sizeof(hash));  
  11.   
  12.     for(i = 0 ; i < len ; ++i)  
  13.     {  
  14.         if(0 == hash[str[i]])  
  15.             hash[str[i]] = 1;  
  16.     }  
  17.     for(i = 0 ; i < 256 ; ++i)  
  18.     {  
  19.         if(0 != hash[i])  
  20.             putchar(i);  
  21.     }  
  22.     printf("\n");  
  23. }  
  24.   
  25. int main(void)  
  26. {  
  27.     int len;  
  28.     char str[1000];  
  29.   
  30.     while(scanf("%s" , str) != EOF)  
  31.     {  
  32.         len = strlen(str);  
  33.         solve(str , len);  
  34.     }  
  35.     return 0;  
  36. }  
第三题:等式变换
输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。
1 2 3 4 5 6 7 8 9 = X
比如:
12-34+5-67+89 = 5
1+23+4-5+6-7-8-9 = 5
请编写程序,统计满足输入整数的所有整数个数。
输入:       正整数,等式右边的数字
输出:       使该等式成立的个数
样例输入:5
样例输出:21
[cpp]  view plain  copy
  1. 转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/39253767  
  2. #include<iostream>  
  3. #include<cstdio>  
  4. using namespace std;  
  5.   
  6. int ops[21];  
  7. const char sym[3] = {'+' , '-' , ' '};  
  8. int result , num;  
  9.   
  10. void dfs(int layer, int currentResult, int lastOp, int lastSum)  
  11. {  
  12.     lastSum *= (layer > 9) ? 100 : 10;  
  13.     lastSum += layer;  
  14.     if(layer == 9)  
  15.     {  
  16.         currentResult += (lastOp) ? (-1 * lastSum) : lastSum;  
  17.         if(currentResult == result)  
  18.         {  
  19.             ++num;  
  20.             printf("1");  
  21.             for(int i = 2 ; i <= 9 ; ++i)  
  22.             {  
  23.                 if(sym[ops[i-1]] != ' ')  
  24.                     printf(" %c ", sym[ops[i-1]]);  
  25.                 printf("%d", i);  
  26.             }  
  27.             printf(" = %d\n" , result);  
  28.         }  
  29.         return;  
  30.     }  
  31.     ops[layer] = 2;  
  32.     dfs(layer + 1 , currentResult , lastOp , lastSum);   //Continue  
  33.     currentResult += (lastOp)? (-1 * lastSum) : lastSum;  
  34.     ops[layer] = 0;  
  35.     dfs(layer + 1 , currentResult , 0 , 0);  //Plus  
  36.     ops[layer] = 1;  
  37.     dfs(layer + 1 , currentResult , 1 , 0);  //Minus  
  38. }  
  39.   
  40. int main(void)  
  41. {  
  42.     while(scanf("%d", &result) != EOF)  
  43.     {  
  44.         num = 0;  
  45.         dfs(1 , 0 , 0 , 0);  
  46.         printf("%d\n" , num);  
  47.     }  
  48.     return 0;  
  49. }  
1. 虚函数是可以[New一个对象的时候要根据虚函数的函数体来填虚表;而内联函数没有函数体,只是在预编译阶段展开]内联的,这样就可以减少函数调用的开销,提高效率(错误) 2. 一个类里可以同时存在[同一个类里无论什么函数都不能函数名和参数完全一样]参数和函数名都相同的虚函数与静态函数(错误) 3. 父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象)[特殊情况,参见题5],会调用父类的析构函数(正确)//任何情况下删除子类都会调用到父类的析构函数 4.对于下面的类CA,sizeof(CA) = _B_: A. 4 B. 8 C. 12 D. 16 class CA { public: CA(); virtual ~CA(); //因为有虚函数,所以会有4个字节的虚表指针 private: int m_iTime; //成员变量4个字节 public: int GetTime(); int SetTime(int iTime); }; 5.下面这段程序,打印结果是_A_: A. 1 B. 2 C. 3 D. 以上都不对 int g_iCount = 0; class CParent { public: CParent() {} ~CParent() {g_iCount += 1;} }; class CSon : public CParent { public: CSon() {} ~CSon() {g_iCount += 2;} }; main() { CParent* p = new CSon(); delete p[由于p被声明成父类指针,并且父类和子类的析构函数都非虚,因此delete操作只能根据p指针声明的类型来调用父类的析构函数]; std::cout << g_iCount << std::endl; } 6.请问下面这段程序的输出结果是_A_: A. 2,1, B. 2,2, C. 1,1, D. 1,2, class CParent { public: CParent() {} virtual ~CParent() {} public: virtual void Print() { std::cout << "1,"; }; }; class CSon : public CParent { public: CSon() {}; virtual ~CSon() {}; public: void Print() { std::cout << "2,"; }; }; void Test1(CParent& oParent[这里是引用了一个外部对象,该对象的虚表不会发生变化]) {oParent.Print();} void Test2(CParent oParent[这里会在栈空间内重新构造一个CParent类的对象,如果传入实参的类型与CParent不同则虚表会发生变化]) {oParent.Print();} main() { CSon * p = new CSon(); Test1(*p); //这里只是一个引用 Test2(*p); //这里会在栈空间重新构造Cparent类对象 delete p; } 7.请问下面这段程序的输出结果是_D_: A. 2,1, B. 2,2, C. 1,1, D. 1,2, class CParent { public: CParent() {} virtual ~CParent() {} public: void Print(){ std::cout << "1," ; }; }; class CSon : public CParent { public: CSon() {} virtual ~CSon() {} public: void Print(){ std::cout << "2,"; }; }; main() { CSon oSon; CParent * pParent = &oSon; CSon * pSon = &oSon; pParent->Print(); pSon->Print();[由于父类和子类的Print函数都非虚,所以根据指针类型决定调用关系] } 8.请问下面这段程序的输出结果是_C_: A. 2,1, B. 2,2, C. 1,2, D. 1,1, class CParent { public: CParent() {Print();} virtual ~CParent() {} public: virtual void Print(){ std::cout << "1,"; } }; class CSon : public CParent { public: CSon() {Print();} virtual ~CSon() {} public: void Print(){ std::cout << "2,"; } }; main() { CParent * pParent = new CSon()[类的构造过程遵循压栈原则,构造过程中虚表尚未建立成功,是静态调用虚函数]; delete pParent; } 9.请问下面这段程序的输出结果是_D_: A. 2,2, B. 2, C. 输出结果不确定 D. 以上都不对 class CParent { public: CParent() {Print();[构造子类对象时调用到父类的构造函数,但父类的Print函数是纯虚的,没有实现,所以这里的调用不成功,编译会出错]} virtual ~CParent() {} public: virtual void Print() = 0; }; class CSon : public CParent { public: CSon() {Print();} virtual ~CSon() {} public: void Print() { std::cout << "2,"; }; }; main() { CParent * pParent = new CSon(); delete pParent; } 10.请仔细阅读以下程序: class Base { public: virtual bool operator == (int iValue) { std::cout << "I am Base class !" << std::endl; return true; } virtual ~Base(){} }; class Derive: public Base { public: virtual bool operator == (int iValue) { std::cout << "I am Derive class !" << std::endl; return true; } virtual ~Derive(){} }; int main() { Derive derive; Base* pBase = &derive; Derive* pDerive = &derive; *pBase == 0; *pDerive == 0;[重载操作符声明为virtual使操作符产生多态性] return 0; } 程序的输出结果是_B_: A、I am Base class ! I am base class ! B、I am Derive class ! I am Derive class ! C、I am base class ! I am Derive class ! D、I am Derive class ! I am Base class !
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值