8-27京东笔试Java开发题解

给了2个小时时间。
30道选择题,2道编程题。
(上一篇帖子我删了 差点成了答案分享区🤣

编程题第一题:

题面

某人只喜欢数字 2, 3, 5这三个数字,如222,333,235这样的。但是12345这样就不是他喜欢的,因为包含了除了2,3,5以外的数字。
现询问这个人喜欢的第n个数字(升序排列的第n个数字)是多少。 n <= 1000;

思路

考虑1000的数据范围并不大。所以可以直接预处理前1000项。
可以以数字的位数作为枚举量,弄出所有的组合而成的数字。
如数字长度为1位时,有2,3,5,这3种情况。
数字长度为2时,有22,23,25,33,32,35,55,52,53。这9种情况。
考虑到这里,我们就不难想到,我们可以枚举第i位的数字,直到长度为预期值即可。
以长度为2举例,首位可能是2,3,5.第二位可能是2,3,5。所以直接深搜即可。

参考代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int[] vis = new int[100];
    public static void main(String[] args) {
        int[] arr = solve();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(arr[n - 1]);
    }
    public static int[] solve(){
        ArrayList<Integer> arr = new ArrayList<>();
        demo:
        for(int i = 1; arr.size() <= 1000; i++){
            dfs(0, i, arr);
        }
        int[] result = new int[arr.size()];
        for(int i = 0; i < arr.size(); i++){
            result[i] = arr.get(i);
        }
        Arrays.sort(result);
        return result;
    }
    public static void dfs(int k, int n, ArrayList<Integer> arr){
        if(k == n){
            int val = 0;
            for(int i = 0; i < n; i++){
                val = val * 10 + vis[i];
            }
            arr.add(val);
            return ;
        }
        vis[k] = 2;
        dfs(k + 1, n, arr);
        vis[k] = 3;
        dfs(k + 1, n, arr);
        vis[k] = 5;
        dfs(k + 1, n, arr);
    }
}

代码中的vis数组为第k项数字所取的值,累加即可得到所组成的值。

第二题

题目:

给你一个二维数组,每次可以往左下,正下,右下走。 询问得到的最大值。
输入n, 代表n行, 每行2 * n - 1个元素。
示例如下图:


思路:

类似于经典的那个三角形之类的dp。
比较简单的做法就是在原数组上直接做;
我们考虑这个过程,第二行第二列这个元素,只能到达第三行1,2,3列这三个元素中的某一个。
所以我们可以倒推,若得到的最大值经过了第二行第二列这个元素,那么第三行取到的一定是max(arr[3][1],arr[3][2],arr[3][3]);
Ok,同理若取了arr[2][3]这个元素,且得到了最大值,那么,则第三行取的必是max(arr[3][2], arr[3][3], arr[3][4]);
。。。。。
都是这样,
对于第k行的每个元素,其整个链取最大时,则必取第k+1行的左下,下方,右下三个元素中的最大值。
即 arr[i][j] = arr[i][j] + max(arr[i + 1][j - 1], arr[i + 1][j], arr[i + 1][j + 1]);
从第n-1行开始转移,直到转移到arr[1][n]这个元素,那么arr[1][n]这个元素,就是整个链的最大值。

参考代码:
import java.util.Scanner;

public class Two {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long[][] arr = new long[n + 1][2 * n];
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= 2 * i - 1; j++){
                arr[i][n - i + j] = sc.nextLong();
            }
        }
        for(int i = n - 1; i >= 1; i--){
            for(int j = 1; j <= 2 * i - 1; j++){
                arr[i][n - i + j] += Math.max(Math.max(arr[i + 1][n - i + j - 1], arr[i + 1][n - i + j]), arr[i + 1][n - i + j + 1]);
            }
        }
        System.out.println(arr[1][n]);
    }
}

代码中的n - i, 为每列的前缀空个数。



#笔试题目##京东#
全部评论
第一题 暴力解: import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner input = new Scanner(System.in);         int n = input.nextInt();         int temp = 0;         for (Integer i = 2; i < Integer.MAX_VALUE; i ++ ) {             String tmp = i.toString();             tmp = tmp.replace("2","").replace("3", "").replace("5", "");             if (tmp.length() == 0) {                 temp++;             }             if (temp == n) {                 System.out.println(i);                 break;             }         }     } }
2
送花
回复 分享
发布于 2020-08-27 21:19
我第一题用的BFS,第一次AK太难了。
1
送花
回复 分享
发布于 2020-08-27 21:14
神州信息
校招火热招聘中
官网直投
我就是从下到上 结果55 不知道为啥呀 转移方程也没错 😓
1
送花
回复 分享
发布于 2020-08-27 21:19
太强了
点赞
送花
回复 分享
发布于 2020-08-27 21:08
666
点赞
送花
回复 分享
发布于 2020-08-27 21:11
我看到好多都是从下往上遍历的,但我的想法是,倒推回去,每个值都可以从正上方、左上方、右上方来,所以当前i,j可取到的最大值是max(dp[i-1][j],dp[i-1][j-1], dp[i-1][j+1])+score[i][j]. 这样从第二行推到最后一行,计算最后一行的最大值。也AC了
点赞
送花
回复 分享
发布于 2020-08-27 21:15
**,第一题用树做我怎么不往这方面想呢。。。我还在那一个算第几个呢?最后才18%,我太菜了
点赞
送花
回复 分享
发布于 2020-08-27 21:16
第一题我用的deque,每次getfirst的数后面添加2、3、5,添加完再添加到队列中 第二题从上到下求,要么从左上,要么从正上,要么从右上来,注意边界就行
点赞
送花
回复 分享
发布于 2020-08-27 21:20
各种三角形的二维数组的初始化,菜鸡觉得好难啊
点赞
送花
回复 分享
发布于 2020-08-27 21:39
第一个题感觉是个三进制,把(n-1)转化成为一个三进制的数,每位取值(0,1,2),对应数字(2,3,5)
点赞
送花
回复 分享
发布于 2020-08-28 09:29
楼主这是把前1000个全找出来了吗
点赞
送花
回复 分享
发布于 2020-08-28 11:08
第一题,要第几个就求第几个,先求出一共几位,然后根据大小逐渐缩小范围,从最高位开始逐一求出每一位的值
点赞
送花
回复 分享
发布于 2020-08-28 11:40
第一题可以用队列
点赞
送花
回复 分享
发布于 2020-08-28 11:49
第一题没人想到三进制吗
点赞
送花
回复 分享
发布于 2020-08-28 15:32
我和12楼的求法是一样的,写是很好写,不过调试的时候花了比较久。 public static void numN(int n){         int length = 1;         int[] count = new int[15];         count[0] = 1;         count[1] = 3;         while(n>count[length]){             n-=count[length];             length++;             count[length] = count[length-1]*3;         }         int[] num = new int[]{2,3,5};         //这个地方不用ans存,直接输出也行         int[] ans = new int[15];         int index=0;         while(length>0){             for(int i=2;i>=1;i--){                 if(i*count[length-1]<n){                     ans[index]=num[i];                     n-=i*count[length-1];                     break;                 }                 ans[index]=2;             }             index++;             length--;         }         for(int i:ans){             if(i==0){                 break;             }             System.out.print(i);         }         System.out.println();     }
点赞
送花
回复 分享
发布于 2020-08-28 17:44

相关推荐

一笑倾城a:遇到阳光开朗大女孩了
点赞 评论 收藏
分享
10 32 评论
分享
牛客网
牛客企业服务