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;
}

 

posted @ 2017-06-28 23:16  静悟生慧  阅读(321)  评论(0编辑  收藏  举报