2017华为优招笔试题
哎,没有接到笔试通知,不知道为啥就错过了。
之后见到题目,前两道编程题。其实都见过类似的题目,有点思路,但是直接快速完整实现出来,水平还是达不到。
这样的题目,也不算难,三道编程题至少AC两道才算可以。但是自己还是写代码写的少,需要多练习,增加熟练度。
第一道题,统计一个字符串中,出现的字母字符串,数字字符串和其他字符组成的字符串的个数。
思想非常简单直观,但对于边界条件以及何时将统计的数量进行增加要仔细考虑。
代码如下:
#include <iostream> #include <string> using namespace std; int main() { string str; getline(cin,str); int a[3] = { 0, 0, 0 }; for (int i = 0; i < str.length()-1;){ while (((str[i] >'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) && i<str.length() - 1){ while (((str[i] >'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) && i<str.length() - 1){ ++i; } a[0]++; break; } while ((str[i] >='0'&& str[i] <= '9' ) && i<str.length() - 1){ while ((str[i] >= '0' && str[i] <= '9') && i<str.length() - 1){ ++i; } a[1]++; break; } while ((str[i] >= 0 && str[i] <= 47) || (str[i] >= 58 && str[i] <= 64) || (str[i] >= 91 && str[i] <= 96) || (str[i] >= 123) && i<str.length() - 1){ while ((str[i] >= 0 && str[i] <= 47) || (str[i] >= 58 && str[i] <= 64) || (str[i] >= 91 && str[i] <= 96) || (str[i] >= 123) && i<str.length() - 1){ ++i; } a[2]++; break; } } for (int m = 0; m < 3; m++){ cout << a[m]; if (m < 2){ cout << ","; } } system("pause"); return 0; }
第二题是将字符串按照单词逐个反转的题目,也是常见题目。一般思想都是做两次翻转。整个字符串翻转,然后将单词逐个翻转。
例如:输入 i am student 输出:student am i
代码如下:
/* 对字符串进行逐词翻转; */ #include <iostream> using namespace std; //编程实现字符串中各单词的翻转 //方法1 void Revese(char *str){ char *start = str, *end = str, *ptr = str; //开头,结尾,中间指针 while (*ptr++ != '\0') { if (*ptr == ' ' || *ptr == '\0') //找到一个单词 { end = ptr - 1; //end指向单词末尾 while (start<end) swap(*start++, *end--); //把单词的字母逆置 start = end = ptr + 1; //指向下一个单词开头 } } start = str, end = ptr - 2;//start指向字符串开头,end指向字符串末尾 while (start<end) { swap(*start++, *end--); } } int main() { char Str[30] = "i am from henan"; Revese(Str); cout << Str << endl; getchar(); return 0; }
方法二:
#include "stdafx.h" #include <iostream> using namespace std; //编程实现字符串中各单词的翻转 //方法2 void Revese(char *str){ char *start=str,*end=str,*ptr=str; while (*ptr++!='\0'); end=ptr-2; //找到字符串末尾 while (start<end) { swap(*start++,*end--);//将整个字符串逆置 } start=str;//指向字符串开头 end=ptr-2;//指向字符串末尾 ptr=start;//指向字符串开头 while (*ptr++!='\0') { if (*ptr==' '||*ptr=='\0') //找到一个单词 { end=ptr-1;//指向单词末尾 while (start<end) { swap(*start++,*end--); } start=end=ptr+1;//指向下一个单词开头 } } } int _tmain(int argc, _TCHAR* argv[]) { char Str[30]="i am from henan"; Revese(Str); cout<<Str<<endl; getchar(); return 0; }