【大众点评】2015年校园招聘在线笔试题之{字符串包含}

题目简介:

有两个字符串,一个常字符串,一个短字符串,以最快的时间判断短字符串中所有的字符是不是在长字符串中出现过。

如:

string strShort = "AbBBcC";   //短字符串 
string strLong = "aAbBBcCdd"; //长字符串
段字符串中所有的字符都在长字符串中出现过,所以答案返回TRUE。

再如:

string strShort = "AbBBcCx";   //短字符串 
string strLong = "aAbBBcCdd"; //长字符串
段字符串中的x在长字符串中没有出现过,答案返回FALSE


解决方案:

设短字符串长度为n,长字符串长度为m。

1、简单暴力搜索,两层循环,时间复杂度为O(n * m)

方法简单暴力,不再赘述;


2、空间换时间

其实很多优化时间复杂度的问题,都可以从以空间换时间的角度去考虑,这是一个可以通用的原则。

本题中我采用一个数组来统计长字符串中每个字符出现的次数,然后再轮询短字符串。如果该字符串对应到次数数组为0,那么证明该字符没有在长字符串中出现过,则返回FALSE。

【时间复杂度分析】:

轮询长字符串,统计每一个字符出现的次数,时间复杂度为O(n);

轮询短字符串,查寻该位置处的次数数组是否为0,时间复杂度为O(m);

总的时间复杂度为:O(n + m)。

【空间复杂度分析】

本代码中安排了一个52大小数组来记录每个数组出现的次数,之所以是52,我主要是考虑到有大小写的问题。


源代码:

#include <iostream>
#include <string>

using namespace std;

bool CheckStr(string strShort, string strLong);

void main()
{
	string strShort = "AbBBcC";   //短字符串 
	string strLong = "aAbBBcCdd"; //长字符串

	if(CheckStr(strShort, strLong))
	{
		cout << "TRUE";
	}
	else
	{
		cout << "FALSE";
	}

	system("pause");
}

bool CheckStr(string strShort, string strLong)
{
	/* 申请一个52大小的数组用于存储每个字符出现的次数,主要考虑到同时存在大小写 */
	int hash[52] = {0};  
	int index = 0;
	
	/* 将长字符串出现的次数统计到数组中 */
	for (int i = 0; i < strLong.length(); i++)
	{
		/* 如果是大写字母 */
		if ((strLong[i] >= 'A') && (strLong[i] <= 'Z'))
		{
			hash[strLong[i] - 'A']++;
		}
		else if ((strLong[i] >= 'a') && (strLong[i] <= 'z'))
		{
			/* 小写字母从下标26开始存储 */
			hash[strLong[i] - 'a' + 26]++;
		}
		else
		{
			cout << "string error";
			return false;
		}
	}

	/* 通过上面的步骤已经将长字符串排序完,下面将轮训短字符串 */
	for (int i = 0; i < strShort.length(); i++)
	{
		/* 如果是大写字母 */
		if ((strShort[i] >= 'A') && (strShort[i] <= 'Z'))
		{
			index = strShort[i] - 'A';
		}
		else if ((strShort[i] >= 'a') && (strShort[i] <= 'z'))
		{
			/* 小写字母从下标26开始存储 */
			index = strShort[i] - 'a' + 26;
		}
		
		/* 如果hash中对应下标的内容为零,则证明长字符串中没有出现过该字符,直接return false */
		if (0 == hash[index])
		{
			return false;
		}
	}

	/* 走到这一步都还没有return false,说明所有的字符都出现过,直接return true */
	return true;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
海康威视是中国领先的安防产品和解决方案提供商,每会在校园内进行招聘,而2013校园招聘中,技术服务工程师(硬件类)专业知识笔试题(B卷)主要包括以下内容。 第一部分为电路基础知识和分析能力。要求考生对常用电子元器件的使用和特性有了解,同时需要具备一定的电路分析能力。题目内容包括常见电子元器件的特性、电路分析和设计,对于电路设计中常见的问题有哪些解决方法等。 第二部分为数字逻辑与计算机组成原理。考查考生对理论知识的理解和掌握能力。题目内容包括数字逻辑的基础和设计,计算机组成原理的基础以及控制器和总线的结构和原理等。 第三部分为微处理器原理和编程能力。测试考生对微处理器的基础和编程能力。题目内容包括微处理器指令的含义和应用,汇编程序设计等。 第四部分为Analog Devices ADI16-B位PCIE数据采集卡的基本知识。该部分旨在测试考生了解该采集卡的结构和应用,并具备一定的使用能力,题目内容包括该采集卡的技术指标、连接与使用方法、数据采集和转换等。 总之,该笔试题主要考查了考生的电路基础知识、数字逻辑与计算机组成原理、微处理器原理以及Analog Devices ADI16-B位PCIE数据采集卡的基本知识。这些都是技术服务工程师需要掌握的理论和实践能力,也是海康威视校园招聘考察人才的主要依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值