欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(JAVA)2020秋招笔试题总结(华为、360)

程序员文章站 2022-06-09 12:05:03
...

目录

1.华为

1.1全量和已占用字符集合(难度:1)

1.2解析逻辑字符串(难度:3)

1.3比特块(难度:1)

1.4文本解析(难度:2)

1.5社交软件好友度(难度:3)

2.360

2.1表面积(难度:1)


1.华为

1.1全量和已占用字符集合(难度:1)

始定两个字符集合, 一个为全量字符集, 一个为已占用字符集。
已占用的字符集合中的字符不能再使用,要求输出剩余可用字符集。

输入描述:

输入为一个字行串,字符串中包括了全量字符集和已占用字符集。两个字符集使用@连接。@前的字符集为全量字符集,@后的字符集合为已占用字符集。
已占用字符集中的字符一定是全量字符集中的字符。

字符集中的字符跟字符之间使用英文逗号分隔。

字符集中的字符表示为字符加数字,字符跟数字使用英文冒号分隔,比如a:1,表示1个a字符。字符只考虑英文字母,区分大小写,数字只考虑正整形,数量不超过 100,如果一个字符都没被占用,@标识仍然存在,例如a:3,b:5,c:[email protected]

输出描述:

可用字符集。输出带回车换行

示例输入:

a:3,b:5,c:[email protected]:1,b:2

示例输出:

a:2,b:3,c:2

题解:

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Scanner;

public class main {
    public static void main(String args[]){
    Scanner scan=new Scanner(System.in);
    String str=scan.nextLine();
    String[] tmp=str.split("@");
    if(tmp.length<2){
        System.out.println(tmp[0]);
        return;//作者:无人机大佬朱志斌
    }
    String[] arryOne=tmp[0].split(",");
    String[] arryTwo=tmp[1].split(",");
    HashMap<String,Integer> map=new LinkedHashMap();
  
    for(int i=0;i<arryOne.length;i++){
        String[] tmpOne=arryOne[i].split(":");
        int cnt=Integer.valueOf(tmpOne[1]);
        map.put(tmpOne[0],cnt);
    }

    for(int i=0;i<arryTwo.length;i++){
        String[] tmpTwo=arryTwo[i].split(":");
        int cnt=Integer.valueOf(tmpTwo[1]);
        map.put(tmpTwo[0],map.get(tmpTwo[0])-cnt);
    }

    String result="";
    
    for(Entry<String,Integer> entry:map.entrySet()){
        if(entry.getValue()>0){
            result=result+entry.getKey();
            result=result+":";
            result=result+entry.getValue();
            result=result+",";}
        }
        char[] tmpThree=result.toCharArray();
        String res="";
        for(int i=0;i<tmpThree.length-1;i++){
            res+=tmpThree[i];
        }            
        System.out.println(res.toString());
    }
}

1.2解析逻辑字符串(难度:3)

有一款社交软件 APP,假说注朋用户m人(0<m<50),用编号为 0~m-1,r[i,j]表示用i 和用户j 好友关系(r[i][j]=0 代表i和j不是好友,r[i][j]=1~9 代表是好友目数值代表熟悉程度,数值越大代表越熟悉,其中r[i][j]=r[j][i],0<=i,j<=m-1)试编制程序,输出某个特定用户i的n 度好
友(1 度好友代表直接好友,2 度好友代表好友的好友,以此类推1<=n<=10),并按推荐值降序输出好友列表(推荐值相同的好友,按好友编号升序,其中推荐值是指关系熟活度之和,比如朋户i和j是好友,且熟悉度r[i][j]=4 ,j和k是好友且熟活度小r[j][k]=6,且i和k 不是好友即r[i][k]=0,则用户k 是用户i的2 度好友且推荐值为可r[i][j]+r[j][k]=10),如果此用户i 没有n 度好友输出-1。

输入描述:

输入一个整数T,表示有T组测试数据(0<T<100)。

对于每组测试数据输入2行,

第1行     输入3 个整型数 m,i,n 分别代表用户数 m,某个用户编号 i,n度好友, 即代表本组测试需要输出用户i的n度好友
第2 行    输入1 个整型数 k,接下来 3*k 个整数用空格隔开,每三个组成关系对,每个关系由3 个整型数组成 i,j,w 代表用户主和的熟悉程度,即 r[i][j]=w,没有输入的关系默认为非好友(r[i][j]=r[j][i]=0)

输出描述:

输出T行,每行对应每组测试数据的用户i的n 度好友,按推荐值降序输出,推荐值相同的好友按好友编号升序,编号间用空格隔开。如果没有n 度好友输出-1

示例输入:

2

10 5 2

13 0 3 5 0 4 9 0 6 8 0 7 5 1 2 6 1 6 1 2 9 7 3 4

  3 3 5 3 3 8 3 3 9 3 5 8 9 7 8 9

10 0 2

13 0 3 5 0 4 9 0 6 8 0 7 5 1 2 6 1 6 1 2 9 7 3 4

  3 3 5 3 3 8 3 3 9 3 5 8 9 7 8 9

示例输出:

7 0 4 9

1 5 8 9

题解:暂无 

1.3比特块(难度:1)

 

在一个int型整数(对应的比特流)中查找某个比特块(本题固定为5,即二进制“101”)出现的次数及首次出现位置,说明:
1.输入次数和首次出现的位置中间用空格隔开。
2.位置从0 开始,即最右边位置为 0,向左依次增加。
3.如果该int型整数中没有找到该比特块,次数返回0,位置返回-1。
4.比特位允许重复使用,如 10101 中间的比特1 可以与前面的01 组成 101,也可以与后面的 10 组成 101。

输入描述:

一个任意的十进制 int 型整数

输出描述:

在输入整数对应的二进制比特流中,比特块(101)出现的次数和首次出现的位置,次数和位置分别以十进制 int 型整数表示,中间用空格隔开

示例输入:

21

示例输出:

2 0

题解:

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int cur = in.nextInt();

            //将整数转化为二进制数
            String binStr = Integer.toBinaryString(cur);//作者:海思安全总工程师程昱婷博士

            //求字符串中的子串
            int count=0;
            int firstIndex=-1;
            
            //方法1:从前往后(当101首次出现,flag置false,则不记录以后出现的位置)
//            boolean flag = false;
//            for(int i = 0; i <binStr.length()-2; i++){
//                if(binStr.substring(i,i+3).equals("101")){
//                    count++;
//                    if(!flag){
//                        firstIndex=i;
//                    }
//                    flag = true;
//                }
//            }

            //方法2:从后往前(不断更新首次出现的位置)
            for(int i = binStr.length(); i > 2; i--){
                if(binStr.substring(i-3,i).equals("101")){
                    count++;
                    firstIndex=i-3;
                }
            }
            System.out.println(count+" "+firstIndex);
        }
    }
}

1.4文本解析(难度:2)

某程序员小A,有一种表格数据需要存储在文件中。表格中的每行,由若干个字骤组成,每个字段可以是整数字符串(字符包数字字母以及特殊字符[email protected]#¥%……&*()",)。小A 设计了一种存储格式,采用文本的方式对表格数据进行存储。文本文件中的每行,代表了表格数据中的行数据。具体格式如下:
    1、采用号分隔不同的字段(逗号前后无空格);
    2、数字直接采用 10 进制的文本存储;
    3、字符串的存储规则如下:

        1)如果字符串中包含逗号以及双引号,则字符串必须在头尾各增加一个双引号,且中间的双引号需要用连续两个双引号来表示。例如:"a,""b",表示字符串 a,"b
        2)如果字符串中末包含逗号以及双引号,则字符串不强制要求在头尾增加双引号,可直接存储。例如:abc,或者"abc"都可以。
    4、空字符串不存储任何字符,例如:a,,b中,有3 个字段,分别为a,空字符串,b;
请帮助小A 设计个算法,用来将单行文本,解析成多个字段,并输出。

输入描述:

 用于存储单行表格数据的一行文本。
  1、用手分隔不同字段的号前后一定没有空格,程序设计者无需考虑此种异常情况
  2、除数字、字母以及特殊字符[email protected]#¥%……&*()",外,不会出现其它字符
  3、输入的数字一定是 10 进制合法正整数,不会出现负数、小数、其它进制数以及格式错误的 10 进制数

输出描述:

第一行,字符串格式是否正确,正确输出字段个数,不正确输出ERROR。
如果输入字符串格式不正确,则输出结束。

如果字符串格式正确,则输出每个字段的值,每个字段单独占一行。
数字采用 10 进制输出,字符串输出解析后的值。

空字符串输出--

示例输入:

a,,1,"b,"""

示例输出:

4

a

--

1

b,"

题解:(没有AC,只过了80%)

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        List<String> list=new ArrayList<>();
        StringBuilder sb=new StringBuilder();
        if(s!=null){
            boolean flag=false;//作者:外星小小朋友
            for(int i=0;i<s.length();i++){
                char c=s.charAt(i);
                if(c==','){
                    if(flag){
                        sb.append(',');
                    }else{
                        if(sb.length()==0){
                            list.add("--");
                        }else{
                            list.add(sb.toString());
                        }
                        sb=new StringBuilder();
                    }
                }else if(c=='"'){
                    if(i+1<s.length() && s.charAt(i+1)=='"'){
                        sb.append('"');
                        i++;
                    }else if(flag){
                        list.add(sb.toString());
                        sb=new StringBuilder();
                        flag=false;
                    }else{
                        flag=true;
                    }
                }else{
                    sb.append(c);
                }
            }
            if(sb.length()!=0){
                list.add(sb.toString());
            }
            if(flag){//作者:猴哥
                System.out.println("ERROR");//作者:西瓜味的猫
            }else{
                System.out.println(list.size());
                for(String str:list){
                    System.out.println(str);
                }
            }
        }
    }
}

1.5社交软件好友度(难度:3)

 

输入描述:

输出描述:

示例输入:

示例输出:

2.360

2.1表面积(难度:1)

将长N*M 厘米的矩形区域划分成N行M 列(每行每列的宽度均为1 厘米),在第i行第j列的位置上叠放Ai,j个边长为1 厘米的正方体(1≤Ai,j≤100),所有正方体就组成了一个立体图形,每个正方体六个面中的一部分会被其它正方体遮挡,未被遮挡的部分的总面积即为该立体图形的表面积,那么该立体图形的表面积是多少平方厘米?

输入描述:

 第一行包含两个整数N和M,1≤N,M≤1000。
 接下来N行,每行包含M个整数,第i行的第j个整数表示 Ai,j

输出描述:

输出表面积的大小。

示例输入:

2 2

2 1

1 1

示例输出

20

题解: 

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        int[][] grid=new int[n][m];

        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
                grid[i][j]=sc.nextInt();
            }
        }
        int res=surfaceArea(grid);
        System.out.println(res);
    }
    public static int surfaceArea(int[][] grid){
        int surface1 = 0;    //记录每个位置上组合立方体的表面积
        int surface2 = 0;    //记录每个位置上组合立方体的邻接面积
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] != 0) {
                    surface1 += grid[i][j] * 4 + 2;    //记录当前位置上组合立方体的表面积
                }
                if (i != grid.length - 1) {
                    //记录 i 行与 i + 1 行的邻接面积      
                    surface2+=(grid[i][j]>grid[i+1][j]?grid[i+1][j]:grid[i][j])*2;                 
                }
                if (j != grid[0].length - 1) {//作者:孙作者
                    //记录 j 列与 j + 1 列的邻接面积    
                    surface2+=(grid[i][j]>grid[i][j+1]?grid[i][j+1]:grid[i][j])*2;                    
                }
            }
        }
        return surface1 - surface2;
    }
}