京东测试岗第二批笔试
笔试分为两种题型:前面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,欢迎大佬批评指正或者有更好的思路可以留言评论