美团笔试第一题

美团笔试第一题骑手,求大佬指正
输入:MPMPCPMCMDEFEGDEHINHKLIN
输出:9 7 8
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Meituan1 {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String str = in.nextLine();
		in.close();
		char[] cs=str.toCharArray();
		class MyMap{
			char c;
			LinkedList<Integer> ls;
			public MyMap(char c) {
				this.c=c;
				this.ls =  new LinkedList<Integer>();
			}
		};
		class Item{
			int start;
			int end;
			public Item(int start, int end) {
				super();
				this.start = start;
				this.end = end;
			}
			
		};
		MyMap[] map=new MyMap[26];
		for(int i=0;i<cs.length;i  ) {
			if(map[cs[i]-'A']==null) {
				map[cs[i]-'A']=new MyMap(cs[i]);
				map[cs[i]-'A'].ls.add(i);
			}else {
				map[cs[i]-'A'].ls.add(i);
			}
		}
		List<Item> rls=new ArrayList<Item>();
		for(MyMap mp:map) {
			if(mp!=null) {
				rls.add(new Item(mp.ls.peekFirst(),mp.ls.peekLast()));
			}
			
		}
		Collections.sort(rls,new Comparator<Item>() { @Override public int compare(Item o1, Item o2) {
				// TODO Auto-generated method stub
				return o2.end-o1.end;
			}
		});
		
		LinkedList<Integer> ls =  new LinkedList<Integer>();
		int l=rls.get(0).start;
		int r=rls.get(0).end;
		while(!rls.isEmpty()) {
			rls.remove(0);
			while(!rls.isEmpty() && rls.get(0).end>l) {
				l=Math.min(l, rls.get(0).start);
				rls.remove(0);
			}
			ls.addFirst(r-l 1);
			if(rls.isEmpty()) {
				break;
			}
			l=rls.get(0).start;
			r=rls.get(0).end;
		}
		Iterator<Integer> it=ls.iterator();
		while(it.hasNext()) {
			System.out.print(it.next() " ");
		}
						 
	}
}


#笔试题目##Java#
全部评论
说说思路呗
点赞 回复 分享
发布于 2019-08-22 17:40
跟楼主前部分思路一致,后部分思路用的leecode合并区间的方法,但是18%通过,楼主一起探讨下怎么样?
点赞 回复 分享
发布于 2019-08-22 22:48
一开始我也是这么想的,然后钻进去出不来了,考完后自己想了下,其实是想的太复杂了,代码如下: import java.util.HashMap; import java.util.Scanner; /**  * MPMPCPMCMDEFEGDEHINHKLIN  * 9 7 8  */ public class Code1_SplitStr {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         String str = sc.nextLine();         sc.close();         if (str == null || str.length() < 1) {             System.out.println(0);             return;         }         // 记录每个字符在str中最后出现的位置         HashMap<Character, Integer> charLastMap = new HashMap<Character, Integer>();         char curChar;         for (int i = 0; i < str.length(); i++) {             curChar = str.charAt(i);             charLastMap.put(curChar, i);         }         // 按照逻辑,分段过程是,每次观察到str的i位置的字符curChar,就需要观察到curChar字符组后出现的位置,         // 那么这之间的部分,必须是同一个段内,然后继续遍历观察,发现新的字符,这时候对于段尾,可能发生变化,即:         // segEnd = charLastMap.get(curChar) > segEnd ? charLastMap.get(curChar) : segEnd;         int segStart = 0;         int segEnd = -1;         StringBuffer sb = new StringBuffer();         while (segEnd != str.length() - 1) {             for (int i = 0; i < str.length(); i++) {                 segStart = segEnd + 1;                 curChar = str.charAt(i);                 segEnd = charLastMap.get(curChar);                 while (i < segEnd) {                     curChar = str.charAt(++i);                     segEnd = charLastMap.get(curChar) > segEnd ? charLastMap.get(curChar) : segEnd;                 }                 sb.append(" " + (segEnd - segStart + 1));             }         }         System.out.println(sb.toString().substring(1));     } }
点赞 回复 分享
发布于 2019-08-23 11:05

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
2 5 评论
分享
牛客网
牛客企业服务