import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int leng=in.nextInt();
int[] list=new int[leng];
for(int i=0;i<leng;i++){
list[i]=in.nextInt();
}
int leng2=in.nextInt();
Integer[] list2=new Integer[leng2];
for(int i=0;i<leng2;i++){
list2[i]=in.nextInt();
}
for(int i=0;i<leng2;i++){
for(int j=i+1;j<leng2;j++){
if(list2[i]>list2[j]){
int tmp=list2[i];
list2[i]=list2[j];
list2[j]=tmp;
}
}
}
int long2=leng2;
for(int i=0;i<leng2-1;i++){
if(list2[i]==list2[i+1]){
list2[i]=null;
long2--;
}
}
int count=0;
Integer[] list2count=new Integer[leng2];
Integer[][] out=new Integer[leng*long2][2];
for(int j=0;j<leng2;j++){
int num=0;
for(int i=0;i<leng;i++){
int k=10;
compare:
if(list2[j]!=null){
while(list2[j]>=k)k*=10;
int tmp=list[i];
while(tmp>=k/10){
if(tmp%k==list2[j]){
out[count][0]=i;
out[count][1]=list[i];
count++;num++;
break compare;
}
tmp/=10;
}
}
}
if(num==0&list2[j]!=null){list2[j]=null;long2--;}
list2count[j]=num;
}
System.out.print((long2+count)*2);
System.out.print(' ');
int a=0,b=0;
for(int i=0;i<leng2;i++){
if(list2[i]!=null){
System.out.print(list2[i]);
System.out.print(' ');
System.out.print(list2count[i]);
System.out.print(' ');
}
b+=list2count[i];
for(;a<b;a++){
System.out.print(out[a][0]);
System.out.print(' ');
System.out.print(out[a][1]);
System.out.print(' ');
}
}
}
}
}
首先依然是定义数组接收数据,然后对数组二进行排序去重
这里把数组二定义为Integer类型,因为int数组不能有null,Integer数组可以有null类型,去重方便
while (in.hasNext()) {
int leng=in.nextInt();
int[] list=new int[leng];
for(int i=0;i<leng;i++){
list[i]=in.nextInt();
}
int leng2=in.nextInt();
Integer[] list2=new Integer[leng2];
for(int i=0;i<leng2;i++){
list2[i]=in.nextInt();
}
for(int i=0;i<leng2;i++){
for(int j=i+1;j<leng2;j++){
if(list2[i]>list2[j]){
int tmp=list2[i];
list2[i]=list2[j];
list2[j]=tmp;
}
}
}
int long2=leng2;
for(int i=0;i<leng2-1;i++){
if(list2[i]==list2[i+1]){
list2[i]=null;
long2--;
}
}
唯一的难点在于如何从整数中找出对应的整数
这个用余数即可,比如求564184,里面是否有564,定义一个k,k=10,while(418>k)k*=10;
这样k=1000,定义一个tmp=564184,while(tmp>k/10),判断tmp%k和不和564相等,相等输出到输出队列里,break,否则tmp/=10。
用数字演示就是564184%1000=184,184!=564,564184/10=56418;56418%1000=418,418!=564,56418/10=5641,
5641%1000=641,641!=564,5641/10=564;564%1000=564,564=564,count++;//计数out加一,然后把该位置的数字,位置和数都放入out[][]中,out[count][0]=i; out[count][1]=list[i];,分别保存数字的位置和数字大小
for(int j=0;j<leng2;j++){
int num=0;
for(int i=0;i<leng;i++){
int k=10;
compare:
if(list2[j]!=null){
while(list2[j]>=k)k*=10;
int tmp=list[i];
while(tmp>=k/10){
if(tmp%k==list2[j]){
out[count][0]=i;
out[count][1]=list[i];
count++;num++;
break compare;
}
tmp/=10;
}

京公网安备 11010502036488号