题目
题目描述
一个整数序列I和一个规则整数序列R(这两个序列里的第一个元素都表示序列里元素的个数,不包括第一个元素)
如果I序列里的第j个元素包含R序列里的第i个元素,则说明I(j)包含R(i)输出描述
按R从小到大的顺序:
(1)先输出R;
(2)再输出满足条件的I的个数;
(3)然后输出满足条件的I在I序列中的位置索引(从0开始);
(4)最后再输出I。
附加条件:
(1)R需要从小到大排序。相同的R只需要输出索引小的以及满足条件的I,索引大的需要过滤掉
(2)如果没有满足条件的I,对应的R不用输出
(3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)
例子:
序列I:15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数) 序列R:5,6,3,6,3,0(第一个5表明后续有5个整数) 输出:30, 3,6,0,123,3,453,7,3,9,453456,13,453,14,123,6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786 说明: 30----后续有30个整数 3----从小到大排序,第一个R<i>为0,但没有满足条件的I<j>,不输出0,而下一个R<i>是3 6--- 存在6个包含3的I<j> 0--- 123所在的原序号为0 123--- 123包含3,满足条件
思路:其实这道题理解完题目意思之后不难,是业务逻辑上的处理问题,然后主要考察的是如何正确使用数据结构,使得算法更简便(用到了Arrays的静态方法,以及对key排好序的TreeMap)
代码:
/**
* Created by hmh on 2017/4/6.
* 数据分类处理
*/
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int num1 = scan.nextInt();//I序列的数量
int[] arr1 = new int[num1];
for(int i = 0; i < num1; i++){
arr1[i] = scan.nextInt();
}
int num2 = scan.nextInt();
int[] arr2 = new int[num2];
for(int i = 0; i < num2; i++){
arr2[i] = scan.nextInt();
}
StringBuilder sb = new StringBuilder("");
int count = 0;
int sum = 0;
Arrays.sort(arr2);//先对R序列进行排序
for(int i = 0; i < num2; i++){
if(i > 0 && arr2[i] == arr2[i-1]){
continue;
}else{
TreeMap<Integer,Integer> map = new TreeMap<>();//TreeMap维护key的顺序,在输出的时候就可以直接取了
for(int j = 0 ; j < num1; j++){
if(String.valueOf(arr1[j]).contains(String.valueOf(arr2[i]))){
map.put(j,arr1[j]);
count++;
}
}
if(map.keySet().size() != 0){
sb.append(arr2[i]+" " + count + " ");
sum = sum + 2;
for(Integer key:map.keySet()){
sb.append(key+" "+ map.get(key)+" ");
sum = sum + 2;
}
}
count = 0;
}
}
int len = sb.toString().length();
System.out.println(sum + " " + sb.toString().substring(0,len-1));
}
}
}