【问题描述】
我准备邀请朋友参加一个party,现在需要将人的名字(名字由"first name"+一个空格+"last name"组成)按照“流行度顺序”排列。具体的方法是,按照"first name"在邀请列表出现的次数排序,如果次数相同就仍然保持邀请列表的原有顺序,这个排序结果就认为是“流行度顺序”的结果。
例如对于{"DON XI","EAGER TOPLEASE","BJ SMITH","BJ JONES","BJ BJ","DON SMITH","EAGER SMITH"}这个邀请列表,因为"BJ"出现3次而"DON"和"EAGER"均出现2次,因此最终的排序结果"first name"为"BJ"的人都需要排在前面,而其他两个"first name"的人由于次数相同,所以仍然保持原有顺序出现在排序结果中。因此最终的结果为{"BJ SMITH", "BJ JONES", "BJ BJ", "DON XI", "EAGER TOPLEASE", "DON SMITH", "EAGER SMITH" }。
定义:
类 Popularity
方法 public String[] sort(String[] reply)
约束:
1、reply数组包含1至50个元素;
2、每个元素包含3至50个字符;
3、每个元素没有前导和后置空格,并且仅由大写字母(A-Z)和空格组成。
测试用例:
1、{"DON XI","EAGER TOPLEASE","BJ SMITH","BJ JONES","BJ BJ","DON SMITH","EAGER SMITH"}
Returns: {"BJ SMITH", "BJ JONES", "BJ BJ", "DON XI", "EAGER TOPLEASE", "DON SMITH", "EAGER SMITH" }
2、{"BOB JONES", "BOB ADAMS", "BOBBY ADAMS", "BOB ADAMS"}
Returns: {"BOB JONES", "BOB ADAMS", "BOB ADAMS", "BOBBY ADAMS" }
3、{"FRED EVANS","AL BAKER","CAL ADAMS","ED FARMER","AL ADAMS","CAL DETROIT"}
Returns: {"AL BAKER", "CAL ADAMS", "AL ADAMS", "CAL DETROIT", "FRED EVANS", "ED FARMER" }
我准备邀请朋友参加一个party,现在需要将人的名字(名字由"first name"+一个空格+"last name"组成)按照“流行度顺序”排列。具体的方法是,按照"first name"在邀请列表出现的次数排序,如果次数相同就仍然保持邀请列表的原有顺序,这个排序结果就认为是“流行度顺序”的结果。
例如对于{"DON XI","EAGER TOPLEASE","BJ SMITH","BJ JONES","BJ BJ","DON SMITH","EAGER SMITH"}这个邀请列表,因为"BJ"出现3次而"DON"和"EAGER"均出现2次,因此最终的排序结果"first name"为"BJ"的人都需要排在前面,而其他两个"first name"的人由于次数相同,所以仍然保持原有顺序出现在排序结果中。因此最终的结果为{"BJ SMITH", "BJ JONES", "BJ BJ", "DON XI", "EAGER TOPLEASE", "DON SMITH", "EAGER SMITH" }。
定义:
类 Popularity
方法 public String[] sort(String[] reply)
约束:
1、reply数组包含1至50个元素;
2、每个元素包含3至50个字符;
3、每个元素没有前导和后置空格,并且仅由大写字母(A-Z)和空格组成。
测试用例:
1、{"DON XI","EAGER TOPLEASE","BJ SMITH","BJ JONES","BJ BJ","DON SMITH","EAGER SMITH"}
Returns: {"BJ SMITH", "BJ JONES", "BJ BJ", "DON XI", "EAGER TOPLEASE", "DON SMITH", "EAGER SMITH" }
2、{"BOB JONES", "BOB ADAMS", "BOBBY ADAMS", "BOB ADAMS"}
Returns: {"BOB JONES", "BOB ADAMS", "BOB ADAMS", "BOBBY ADAMS" }
3、{"FRED EVANS","AL BAKER","CAL ADAMS","ED FARMER","AL ADAMS","CAL DETROIT"}
Returns: {"AL BAKER", "CAL ADAMS", "AL ADAMS", "CAL DETROIT", "FRED EVANS", "ED FARMER" }
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashSet;
- import java.util.Set;
- public class Popularity {
- public String[] sort(String[] reply) {
- ArrayList<String> res = new ArrayList<String>();
- // 记录所有不重复的first name
- ArrayList<String> firstList = new ArrayList<String>();
- // 记录对应first name出现的数量
- ArrayList<Integer> numList = new ArrayList<Integer>();
- String[][] replyNew = new String[reply.length][2];
- String tmp = "";
- int index;
- for (int i = 0; i < reply.length; i++) {
- tmp = reply[i].split("//s")[0];
- replyNew[i][0] = reply[i];
- replyNew[i][1] = tmp;
- if (firstList.contains(tmp)) {
- index = firstList.indexOf(tmp);
- numList.set(index, numList.get(index).intValue() + 1);
- } else {
- firstList.add(tmp);
- numList.add(1);
- }
- }
- // 剔除重复数之后的所有first name的数量
- Set<Integer> numSet = new HashSet<Integer>();
- for (Integer i : numList) {
- numSet.add(i);
- }
- Integer[] numArray = numSet.toArray(new Integer[0]);
- Arrays.sort(numArray);
- // 遍历所有可能的数量,并对照相应的first name是否出现了这个数量次,如果是则加入结果列表
- for (int i = numArray.length - 1; i >= 0; i--) {
- for (int k = 0; k < replyNew.length; k++) {
- index = firstList.indexOf(replyNew[k][1]);
- if (numArray[i].intValue() == numList.get(index).intValue()) {
- res.add(replyNew[k][0]);
- }
- }
- }
- return res.toArray(new String[0]);
- }
- }