笔试分为两种题型:前面20道选择题,后面3道编程题;
选择题包括:计算机网络(三次握手四次挥手、子网掩码、HTTP协议等)、Java基础知识(静态方法和实例方法...)...
编程题3道:
1、赝品可能最大数量
一批物品n个,输入n个数代表其价值,真品价值比赝品大,要求输入可能的赝品个数,其中真品至少一个
我的解题思路:找数值最大的值,一定是真品的值,总个数-最大值的个数=赝品个数
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int[] nums = new int[a];
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0;i<a;i++){
nums[i] = in.nextInt();
}
for(int i = 0;i<a;i++){
if(map.get(nums[i])!=null){
map.put(nums[i],map.get(nums[i])+1);
}else {
map.put(nums[i],1);
}
}
int max_v = 0;
for(int v:map.keySet()){
if(max_v<v){
max_v = v;
}
}
2、求满足条件的最小约数
输入n个数,求每一个数值(a)满足p*p>a的约数p
我的解题思路:对于每一个数从2开始求它的约数p,并判断是否满足p*p>a,直到a/2。
但是只通过了44.5%的例子,定位到问题是因为输入的数值过大(11位)直接按字符串输入了,当时没时间改了
Scanner in = new Scanner(System.in);
int a = in.nextInt();
long[] nums = new long[a];
for(int i = 0;i<a;i++){
nums[i] = in.nextLong();
}
for(int i = 0;i<a;i++){
int flag = 0;
for(int k=2;k<nums[i]/2+1;k++){
if (nums[i]%k==0){
if(k*k>nums[i]){
flag = 1;
System.out.println(k);
break;
}
}
}
if(flag==0){
System.out.println(nums[i]);
}
}
3、求分解次数
输入数组包括n个数,对于每一个数a进行分解,比如2可以分解成1和1,需要分解一次;3可以分解成1+2,2再分解成1和1,共分解2次;6可以分解成2*3,再进行分解,共4次,求数组中数据共需要分解多少次
解题思路:借助hashmap+递归
当时没时间测试了一下报错就时间到了,也没来得及提交代码,结束之后改了一下代码不知道能通过多少用例
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static int numsMove(int n,HashMap<Integer,Integer> map){
int min = 0;
if(n==1){
map.put(n,0);
return 0;
}
if(n==2){
map.put(n,1);
return 1;
}
if(map.get(n)!=null){
return map.get(n);
}else{
int flag = 0;
for(int i=2;i<n/2+1;i++){
if(n%i==0){
flag = flag + 1;
if(flag == 1){
min = numsMove(i,map)+numsMove(n/i,map)+1;
}
if(numsMove(i,map)+numsMove(n/i,map)+1<min){
min = numsMove(i,map)+numsMove(n/i,map)+1;
};
}
}
if(flag == 0){
min = 1 + numsMove(n-1,map);
}
map.put(n,min);
return min;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int[] nums = new int[a];
for(int i = 0;i<a;i++){
nums[i] = in.nextInt();
}
int sum = 0;
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0;i<a;i++){
sum = sum + numsMove(nums[i],map);
}
System.out.println(sum);
}
}
以上三道编程是我的解题思路,其中2、3不能保证100%AC,欢迎大佬批评指正或者有更好的思路可以留言评论,祝大家早日拿到合适的offer!
#京东笔试##京东秋招##测试开发#