(JAVA)2020秋招笔试题总结(华为、360)
目录
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;
}
}
上一篇: [学习笔记]记录一些前端面试题
下一篇: 记录一些前端面试题(带答案)