360笔试题目

记得本科的时候算法课上看到过这个题目,当时没有做出来,今天做360笔试的时候竟然仍然没做出来,真蛋疼。回来研究了半天,我擦,两个小时做那么多题目,这个肯定做不出来。

题目:

大意是:给定一个字符串S:“BLFBFSYDLEAKLFBYM”,和一个关键字T:“LBY”,求出在S中包含T的最小字符串?那么应该求出最小字符串:“LFBY”

思路一:遍历T,再遍历S。(咋一看是这样,但是操作起来比较麻烦,我也没实现)

思路二:分别求出关键字T中第一个字符和最后一个字符在S中的位置P1,P2,那么我们要求的答案就在P1和P2的组合当中。(额外浪费了很多空间)

按道理,两种思路都可以行的通。目前,我按照思路二实现Java版的:

<span style="font-size:18px;">        </span><span style="font-size:14px;">
		public static void main(String []args)
			{
               final String content="BLFBFSYDLEAKLFBYM";
               final String key="LBY";
               System.out.println(getAbstract(content, key));
			}
		/*
		 * content="BLFBFSYDLEAKLFBYM"
		 * key="LBY"
		 * 求包含key的最小字符串
		 * 注意abstract是L***Y,开始的肯定是L,结束的是Y
		 */
		public static String getAbstract(String content,String key)
		{
			String tempString="";
//			 * 依次找到在content中L出现的位置和Y出现的位置
//			 * 那么要求的摘要只可能出现在L的位置和Y的位置的组合中
			ArrayList<Integer> keyFirstList=new ArrayList<Integer>();
			ArrayList<Integer>keyLastList=new ArrayList<Integer>();
			for(int i=0;i<content.length();i++)
				{
					if(content.charAt(i)==key.charAt(0))
						keyFirstList.add(i);
					else if(content.charAt(i)==key.charAt(key.length()-1))
						keyLastList.add(i);
					else
						;//do noting
				}
			//得到所有的可能位置组合
			//注意,很多组合显然不合适,start位置必须小于end的位置
			int [][]maxAbstact=new int[keyFirstList.size()][keyLastList.size()];
			for(int i=0;i<keyFirstList.size();i++)
				for(int j=0;j<keyLastList.size();j++)
					{
						if(keyFirstList.get(i)>=keyLastList.get(j))
							maxAbstact[i][j]=-1;
						else
							{
								maxAbstact[i][j]=isContainKey(content, key,
										keyFirstList.get(i), keyLastList.get(j));
							}
					}
			int minLength=content.length();
			int start = 0 ,end = 0;
			//求出数据中的最小值,即要求字符串的最小的长度
			for(int i=0;i<keyFirstList.size();i++)
				for(int j=0;j<keyLastList.size();j++)
					{
						if(maxAbstact[i][j]>-1&&maxAbstact[i][j]<minLength)
							{
								minLength=maxAbstact[i][j];
								start=i;
								end=j;
							}
					}
			for(int i=keyFirstList.get(start);i<=keyLastList.get(end);i++)
				{
				   tempString+=content.charAt(i);
				}
			return tempString;
		}
		/*
		 * 从start 到end的位置是否包含key
		 */
		public static int isContainKey(String content ,String key,int start,int end)
		{
			int newStart=start;
			for(int i=1;i<key.length()-1;i++)
				{
					int j=newStart+1;
					for(;j<end;j++)
						{
							if(content.charAt(j)==key.charAt(i))
								{
									newStart=j;
									break;
								}
						}
					if(j==end)
						return -1;
				}
			return end-start;
		}</span>
时间: 2024-08-07 02:13:44

360笔试题目的相关文章

360笔试题目-HashMap实现

自定义一个HashMap,实现map_put,map_delete,map_get方法,要求: 1.查找时间复杂度O(1) 2.. 3.. 因为Java中自带HashMap,平时直接用,也没有考虑,前一段时间只是实现了ArrayList,Vetor,Quene,并没有考虑HashMap.笔试的时候由于时间紧,我只是在HashMap中定义两个ArrayList,一个保存Key,一个保存Value,现在想想肯定是不对的,这根本没有按照要求实现.题目的原意是让实现链表,考察操作链表的能力.回来之后,我

360笔试编程题

360笔试题目: C++简单实现: 1 #include <stdio.h> 2 #include <iostream> 3 #include <math.h> 4 #include <sstream> 5 #include <cstring> 6 #include <vector> 7 #include <algorithm> 8 9 using namespace std; 10 11 12 const int MAX

算法学习 并查集(笔试题目:找同伙)

题目背景太长,记得不清楚,暂参考<啊哈算法>一书,根据笔试题目大意改编如下: 警察正要捉获某地区的犯罪团伙,由于强盗人数过大,想查清楚有几个团伙非常困难. 根据上级指示,需要首先尽快抓获强盗A所在的团伙,这需要掌握 1 所在团伙的人数.先有资料如下: 强盗1 和 强盗2 是同伙 强盗3 和 强盗4 是同伙 强盗2 和 强盗5 是同伙 强盗3 和 强盗2 是同伙 注意,强盗的同伙的同伙也是同伙,问  强盗1 的同伙(不包括1自己)有多少人? 该题形式化表示如下: 每个测试实例首先包括2个整数:N

2017 校招网上笔试题目

2017 校招网上笔试题目 做了一下某大厂的笔试的题目 1. 一个表, visit(cookie_id, area1, area2, date) 给出各种查询策略中, 哪一种最好,每一条SQL语句大同小异, 几乎看不出区别, 还有6,7个选项,同时字数很长.一般的SQL语句好像有根据查询的嵌套顺序来比较差异的,但是这道题反而没有.反正蒙了一个.没有数字可算,心里没有底,应该证明了SQL语法可能会很大地影响查询效率. 2. 给了几个条件,判断你的名次.又是球赛的问题,考查你的推理能力. 3. en

几道经典的SQL笔试题目

几道经典的SQL笔试题目(有答案) (1)表名:购物信息 购物人      商品名称     数量 A            甲          2 B            乙          4 C            丙          1 A            丁          2 B            丙          5 …… (其他用户实验的记录大家可自行插入) 给出所有购入商品为两种或两种以上的购物人记录 答:select * from 购物信息 wher

360笔试-关于手表指针

关于手表指针的算法思考 我们都知道手表上又时分秒三个指针,时针可以决定分针和秒针的位置,分针可以决定秒针的位置.为了简单起见,现在假设只有时针和分针. 现假设某一刻为H:M,(H=0,1,2-11:M=0,1,2..59),那么在该时刻分针的角度(距离起点0点)为:,时针的角度:, 那么时针和分针的夹角: 问题1.时针和分针重合的时刻? 令,化简之后得: 由此可见,每个小时之中都有一个时刻满足时针和分钟重合,注意当H=11的时候,M=60,也就是12点,即0点.所有满足时针分针重合的时刻为: [

分享两道笔试题目

前几天,给成都的某家公司投了个简历,给发了两道笔试题目,与大家分享一下.附上自己的解题过程,写得不好的地方,还请博友多多指教. 一 .  设计程序输出销售及收费清单 一个电商平台对在其平台之上销售的除了书籍.食品以及药物以外的商品收取 10% 的费用.而对于进口的商品则额外收取 5% 的附加费用.对于平台抽取的费用计算时,舍入的规则是:对于 n% 抽取率,价格为 p的商品, np/100 的值就近舍入到 0.05(如: 7.125 -> 7.15, 6.66 -> 6.70 ). 卖家卖出一些

猜数字游戏(笔试题目)

在CSDN上看到一个笔试题目..收藏一下 机试就一个题目:写一个猜数字游戏,电脑随机生成一个数字(比如 1-100 之间)让玩家猜,如果没猜中,就告诉玩家猜的数字是大了还是小了,直到猜中为止,最后告诉玩家猜了多少次.整个游戏用最简单的控制台输入输出就行 package com.sun.demo; import java.util.Random; import java.util.Scanner; public class Test01 { public static void main(Stri

GameLoft笔试题目 [Online Network Programmer Test]

gameloft 笔试题目是英文的,前面全部是理论的,最后两道是编程题目. 1 2 3 4 5 最后两道编程题目 其实还算简单: #include <stdio.h> #include <string.h> #include <iostream> std::string itoa(int number){ char nstr[15]; sprintf(nstr,"%d",number); return std::string(nstr); } usi