题目描述
请设计一个高效算法,再给定的字符串数组中,找到包含"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.*;
//1.大写转小写
//2.统计每个coder的个数,出现coder的字符串,用bean存储并添加到容器中
//3.对容器用Collections.sort排序,首先按出现次数排序,其次按下标排序
//4.由排序规则可以看出,bean中要存放的有下标和出现的个数。
public class Coder {
public String[] findCoder(String[] strs, int n) {
// write code here
if(strs == null||n == 0)
return strs;
ArrayList<Bean> array=new ArrayList();
for(int i=0;i<n;i++)
{
String s=strs[i].toLowerCase();//转成小写
if(s.contains("coder"))//是否包含有coder
{
int count=0;
//indexOf()若不存在则返回-1;否则返回首次出现的起始位置.
int start=0;
int index=0;
while(start<s.length()&&(index=s.indexOf("coder",start))!=-1)
{
count++;
start=index+"coder".length();//一头蠢猪!!!
}
array.add(new Bean(strs[i],i,count));
}
}
//按规则进行排序
Collections.sort(array,new Comparator<Bean>(){
public int compare(Bean first,Bean second){
if(first.count!=second.count)
{
return second.count-first.count;
}else
{
return first.index-second.index;
}
}
});
String[] result=new String[array.size()];
for(int i=0;i<result.length;i++)
{
result[i]=array.get(i).str;
}
return result;
}
//Bean 容器
class Bean{
String str;
int index;
int count;
public Bean(String str,int index,int count){
this.str=str;
this.index=index;
this.count=count;
}
}
}