java上机面试题,算法
题目:{“aa”,“ab”,“abc”,“bc”,“bac”,“cab”,“abc”,“123”,“321”,“1”} 数组,找出字符中相同字符为一组,进行分组,比如abc和cab就是一组
今天说阿里有面试题就是上面,小G就抛转引玉的写了下,别喷, 思路: 第一: 使用素数,把字符对应不一样的素数,素数:只有1和本身可以整除的数,然后进行相乘,最后判断结果是否相同,相同就为相同元素组成字符串 第二: 1、先思考下输出是什么的数据结构 2、然后进行比较数组中字符中是否都包相同字符,得出结论就是,把数组中的字符串转化字符进行排序进行比对 3、string转化为char,然后排序,这样防止一个个遍历,就出现复杂度O(n^2),如果排序后,在进行比较就是0(1),因为中间需要charAt有多少就需要遍历多少,所以这个地方我们家一个缓存tem
public class SomeTest {
public static ScheduledThreadPoolExecutor executorService=new ScheduledThreadPoolExecutor(2);
public static void main(String[] args) {
SomeTest someTest=new SomeTest();
String[] dataS={
"aa","ab","abc","bc","bac","cab","abc","123","321","1"};
List<String> listB= Arrays.asList(dataS);
List<List<String>> result= someTest.setArrayList(listB);
System.out.println(result.toString());
}
//分组
public volatile List <List<String>> tem=new ArrayList<List<String>>();
//排序获得缓存
public volatile HashMap<Integer,String> temp=new HashMap<>();
//["abc","cab","cad"]
public List<List<String>> setArrayList(List<String> lists){
tem.add(Collections.singletonList(lists.get(0)));
if(lists.size()==0||lists.size()==1){
return tem;
}
for(int i=1;i<lists.size();i++){
//遍历加入新的组后注解比较,因为这个是一直增加,这个如果后面不加break;可重后想前加载,比如j=tem.size;j<0;j--
for(int j=0;j<tem.size();j++){
String data=lists.get(i);
//比较
if(!isSome(data,tem.get(j).get(0),j)){
if(tem.size()==j+1){
List<String> addNew=new ArrayList<String>();
addNew.add(data);
tem.add(addNew);
//不直接break就會出現,新增的重新變量一下tem
break;
}
}else {
List<String> set=tem.get(j);
if(set==null){
System.out.println("异常");
continue;
}
set.add(lists.get(i));
break;
}
}
}
return tem;
}
//比较
public Boolean isSome(String str,String someStr,int index){
if(str.length()!=someStr.length()){
return false;
}
if(str.equals(someStr)){
return true;
}
String someStrSort=temp.get(index);
if(null==someStrSort){
someStrSort= sort(someStr);
temp.put(index,someStr);
}
String strSort=sort(str);
System.out.println(String.format("%s 和 %s 比较",someStrSort,strSort));
return someStrSort.toUpperCase().equals(strSort.toUpperCase());
}
//字符串排序
public static String sort(String someStr){
someStr=someStr.toUpperCase();
char [] temA =new char[someStr.length()];
for(int i=0;i<someStr.length();i++){
temA[i]=someStr.charAt(i);
}
Arrays.sort(temA);
return String.valueOf(temA);
}
}
打印:
AA 和 AB 比较 aa 和 BC 比较 AB 和 BC 比较 ABC 和 ABC 比较 abc 和 ABC 比较 abc 和 123 比较 abc 和 123 比较 123 和 123 比较 [[aa], [ab], [abc, bac, cab, abc], [bc], [123, 321], [1]]
下一篇:
线性结构和非线性结构
