Topcoder_152

【问题描述】
    我准备邀请朋友参加一个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" }
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. public class Popularity {
  6.     public String[] sort(String[] reply) {
  7.         ArrayList<String> res = new ArrayList<String>();
  8.         // 记录所有不重复的first name
  9.         ArrayList<String> firstList = new ArrayList<String>();
  10.         // 记录对应first name出现的数量
  11.         ArrayList<Integer> numList = new ArrayList<Integer>();
  12.         String[][] replyNew = new String[reply.length][2];
  13.         String tmp = "";
  14.         int index;
  15.         for (int i = 0; i < reply.length; i++) {
  16.             tmp = reply[i].split("//s")[0];
  17.             replyNew[i][0] = reply[i];
  18.             replyNew[i][1] = tmp;
  19.             if (firstList.contains(tmp)) {
  20.                 index = firstList.indexOf(tmp);
  21.                 numList.set(index, numList.get(index).intValue() + 1);
  22.             } else {
  23.                 firstList.add(tmp);
  24.                 numList.add(1);
  25.             }
  26.         }
  27.         // 剔除重复数之后的所有first name的数量
  28.         Set<Integer> numSet = new HashSet<Integer>();
  29.         for (Integer i : numList) {
  30.             numSet.add(i);
  31.         }
  32.         Integer[] numArray = numSet.toArray(new Integer[0]);
  33.         Arrays.sort(numArray);
  34.         // 遍历所有可能的数量,并对照相应的first name是否出现了这个数量次,如果是则加入结果列表
  35.         for (int i = numArray.length - 1; i >= 0; i--) {
  36.             for (int k = 0; k < replyNew.length; k++) {
  37.                 index = firstList.indexOf(replyNew[k][1]);
  38.                 if (numArray[i].intValue() == numList.get(index).intValue()) {
  39.                     res.add(replyNew[k][0]);
  40.                 }
  41.             }
  42.         }
  43.         return res.toArray(new String[0]);
  44.     }
  45. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值