寻找Coder

请设计一个高效算法,再给定的字符串数组中,找到包含”Coder”的字符串(不区分大小写),并将其作为一个新的数组返回。结果字符串的顺序按照”Coder”出现的次数递减排列,若两个串中”Coder”出现的次数相同,则保持他们在原数组中的位置关系。
给定一个字符串数组A和它的大小n,请返回结果数组。保证原数组大小小于等于300,其中每个串的长度小于等于200。同时保证一定存在包含coder的字符串。

测试样例:
[“i am a coder”,”Coder Coder”,”Code”],3
返回:[“Coder Coder”,”i am a coder”]

import java.util.*;

public class Coder {

    Map<String, Integer> map = new HashMap<String, Integer>();
    List<String> list = new ArrayList<String>();

    public String[] findCoder(String[] A, int n) {
        // write code here
        int len = 0;
        for(int i=0; i<n; i++){
            String s = A[i].toLowerCase();
            if(s.indexOf("coder") != -1){
                int temp = count(s);
                list.add(s);
                map.put(s, temp);
                len++;
            }
        }

        Collections.sort(list, new Comparator<String>(){

            public int compare(String s1, String s2){
                if(map.get(s1) < map.get(s2)) return 1;
                else if(map.get(s1) > map.get(s2)) return -1;
                else if(list.indexOf(s1) > list.indexOf(s2)) return 1;
                else return -1;
            }
        });

        int size = list.size();
        String[] rst = new String[size];
        for(int i=0; i<size; i++)
            rst[i] = list.get(i);

        return rst;

    }

    public int count(String s){
        int cnt = 0, pos = -1;
        String ss = s.toLowerCase();
        while((pos = ss.indexOf("coder")) != -1){
            cnt++;
            ss = ss.substring(pos + 5);
        }
        return cnt;
    }
}

瓶颈就是:已知字符串数组的每个字符串对应一个int,怎么根据排序规则对该数组进行排序,规则就是先比int,比完相同在比字符串出现的顺序。

解决方案就是:自定义一个 Comparator,因为要通过字符串知道int,所以把String对应的int保存到HashMap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值