码迷,mamicode.com
首页 > 其他好文 > 详细

笔试题86. 百度笔试题

时间:2016-08-22 00:31:37      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

技术分享技术分享

    原题如图所示,之前笔试的时候没有想出来,今天突然看见了,所以就动手试了试。这个题的意思相信上面已经表达清楚了,下面我就直奔主题。

    第一眼见到这个题的时候,满脑子想的是循环匹配。要是精力集中在怎么去匹配,那么这个题多半是做不出来了,因为循环会将你引导一条错误的方向上。我也执着于怎么去匹配,执着了好久还是觉得时间复杂度上无法达标,这个时候我就在草稿纸上写了几个例子,于是发现了一些特点。

    其实我们只需要保留一个单词的第一个字母和最后一个字母就行了(其他的字母对于解题来说么有任何意义,只会增加解题负担),但是单词的长度可能为1(长度为1的时候可以直接不用考虑,这点相信大家可以明白),理清了解题的障碍,下面我们就开始解题!

    我的思路是统计单词首尾字母出现的次数,最后有两种情可以说明满足条件:

1.除了两个字母出现的次数为奇数外,其他字母出现的次数均为偶数(中间的满足接龙条件,剩下开头和结尾两个字母,他们不同)

2.所有字母出现的次数都为偶数(上面的情况中,最后的开头和结尾是相同的)

    下面是代码的实现:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

void SolveStr(vector<string>& Vstr){
	if (Vstr.size() == 0){
		cout << "Yes" << endl;
		return;
	}
	//Vstr中的所有项目都成为了[k,v]的键值对
	
	int size = Vstr.size();
	int arr[256] = { 0 };
	for (int i = 0; i < size - 1; ++i)
	{
		arr[Vstr[i][0]]++;
		arr[Vstr[i][1]]++;
	}

	int signum = 0;

	for (int i = 0; i < 256; i++)
	{
		if (arr[i] != 0 && arr[i] % 2 != 0)
		{
			++signum;
		}
	}

	if (signum == 0 || signum == 2)
		cout << "Yes" << endl;
	else
		cout << "No" << endl;
}

int main(){
	int n = 0;
	while (cin >> n){
		vector<string> Vstr;
		//Vstr.resize(n);
		for (int i = 0; i< n; ++i){
			string tmp;
			cin >> tmp;
			if (tmp.size() > 1){
				string str;
				str.push_back(tmp[0]);
				str.push_back(tmp.size() - 1);
				Vstr.push_back(str);
			}
		}
		SolveStr(Vstr);
	}
	return 0;
}

笔试题86. 百度笔试题

标签:

原文地址:http://blog.csdn.net/zr1076311296/article/details/52270356

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!