题解 HJ25| #数据分类处理#
数据分类处理
https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd
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;
}
#华为od# 查看13道真题和解析
查看13道真题和解析
