题解 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#随便发发而已