笔试题86. 百度笔试题

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

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

其实我们只需要保留一个单词的第一个字母和最后一个字母就行了(其他的字母对于解题来说么有任何意义,只会增加解题负担),但是单词的长度可能为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;
}
时间: 2024-12-23 22:59:30

笔试题86. 百度笔试题的相关文章

算法--两道百度笔试题

算法--两道百度笔试题 今天看到一位园友写了一篇关于百度的面试题的博客,成了评论头条,再下看了一下,非常感兴趣,那位博主的算法能力跟我一样需要提高,估计他的功力还在我之下,所以再下不才,在这里把自己的源码贴出来. 百度面试题(一):假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数和正数间元素相对位置不变.时空复杂度要求分别为:o(n)和o(1).          其实开始的时候我也是一头雾水,在纸上画画之后发现,其实就是一道变形的插入排序.幸运的是

百度笔试题:malloc/free与new/delete的区别(转)

百度笔试题:malloc/free与new/delete的区别 相同点:都可以申请动态内存和释放内存. 不同点: (1) 操作对象有所不同: malloc和free是C/C++的标准库函数,new和delete是C++的运算符.对于非内部数据类的对象而言,光用malloc/free 无法满足动态对象的要求.对象在创建时要自动执行构造函数,对象消亡之前要自动执行析构函数,malloc和free是库函数而不是运算符,不在编译器的控制权限之内,不能够把执行构造函数和析构函数的任务强加给malloc/f

(笔试题)php练习笔试题(六)

加 php自学与交流QQ群:435916459 极客学院教学视频 想要领取极客学院"整套学习视频基础教程"(所谓整套就是从前端到后端的基础视频教程,比较适合新手)的同学,可以加QQ?2084533608,领取视频教程,加入时验证信息填:微信平台 欢迎关注:轻松学PHP "轻松学PHP",有学习文档,框架视频教程,网站教程,提供百度分享给大家下载,收藏.大家关注后回复关键词,便可获取!平台将与大家分享前端到后端的实例,学习语法,学习教程,技巧等!欢迎大家关注! 文章正

百度面试题(总结+更新)

关于百度面试题我现在的感觉是用不上很深的算法,但是思路很灵活,前边已经我已经贴出了5种解法的源代码,本来以为可以到此收尾,今天又有一位同学说了一种思路比较奇怪但是符合题意的方法..请看关于淘汰85%面试者的百度开发者面试题的看法的评论,@apollokk . 后边我也说过几种优化后的方法,如果你还没有看可以看一下百度开发者面试题(优化)这篇文章,关于它的总结你可以参看:百度开发者面试题(总结),当然本问还是要把apollokk的方法的完整代码贴出了,由于思路不难,我就不多说废话了(顺便说一下,输

偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2013/01/30/394920.html 其中下面有人评论为: 有序列表查找显然二分啊,博主貌似对java的arrays和collections不是很熟. private static int getMinAbsoluteValue(final int[] source) { int index

面试题收集-java面试题及答案(基础题122道,代码题19道)

JAVA相关基础知识1.面向对象的特征有哪些方面?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派

【面试题】 Android面试题

Android面试题 网上收集的面试题,是一次很好Android理论补充学习! 1.android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念: 答:dvm是dalivk虚拟机.每一个android应用程序都在自己的进程中运行,都拥有一个dalivk虚拟机实例.而每一个dvm都是在linux的一个进程.所以说可以认为是同一个概念. 2.android的动画有哪几种?他们的特点和区别是什么? 答:两种,一种是tween动画,一种是frame动画.tween动画,这种实现方式可

百度笔试题(移动软件开发岗)

第一道题:C++/Java/Objective-C/C#语言是如何体现面向对象思想的. 不管什么面向对象语言,其面向对象思想就是通过面向对象特点:继承,封装,多态来实现面向对象设计(好像还有个抽象性,这里就不说了). 在Java中: 继承性   Java通过继承实现代码复用.继承而得到的类称为子类,被继承的类称为父类.子类不能继承父类中访问权限为private的成员变量和方法.子类可以重写父类的方法,及命名与父类同名的成员变量.但Java不支持多重继承,即一个类从多个超类派生的能力.封装性   

再现9月20号今天的百度笔试题

一  简答题 1.进程和线程有什么区别?(到处都在问这个问题) 2.简诉数据库的存储过程及其优点.(我实习的时候就是一直在写存储过程,所以) 3.全局static变量和普通全局变量区别?static局部变量和普通局部变量的区别?static函数和普通函数的区别? 二 算法与程序设计题 1.编码实现函数 void* memcpy(void* des, void* src, int len) 2.有这样一个二维矩阵A[N][N],满足j < k时, 1)a[i][j] < a[i][k]; 2)a