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

360笔试题目

时间:2015-04-25 07:02:25      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:算法 360笔试 java

  记得本科的时候算法课上看到过这个题目,当时没有做出来,今天做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>

360笔试题目

标签:算法 360笔试 java

原文地址:http://blog.csdn.net/yilip/article/details/45264107

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