题解 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#
华为OD笔试库讲解,JAVA版 文章被收录于专栏

随便发发而已

全部评论

相关推荐

不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务