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
我就是从下到上 结果55 不知道为啥呀 转移方程也没错 😓
1 回复 分享
发布于 2020-08-27 21:19
我第一题用的BFS,第一次AK太难了。
1 回复 分享
发布于 2020-08-27 21:14
我和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
第一题没人想到三进制吗
点赞 回复 分享
发布于 2020-08-28 15:32
第一题可以用队列
点赞 回复 分享
发布于 2020-08-28 11:49
第一题,要第几个就求第几个,先求出一共几位,然后根据大小逐渐缩小范围,从最高位开始逐一求出每一位的值
点赞 回复 分享
发布于 2020-08-28 11:40
楼主这是把前1000个全找出来了吗
点赞 回复 分享
发布于 2020-08-28 11:08
第一个题感觉是个三进制,把(n-1)转化成为一个三进制的数,每位取值(0,1,2),对应数字(2,3,5)
点赞 回复 分享
发布于 2020-08-28 09:29
各种三角形的二维数组的初始化,菜鸡觉得好难啊
点赞 回复 分享
发布于 2020-08-27 21:39
第一题我用的deque,每次getfirst的数后面添加2、3、5,添加完再添加到队列中 第二题从上到下求,要么从左上,要么从正上,要么从右上来,注意边界就行
点赞 回复 分享
发布于 2020-08-27 21:20
**,第一题用树做我怎么不往这方面想呢。。。我还在那一个算第几个呢?最后才18%,我太菜了
点赞 回复 分享
发布于 2020-08-27 21:16
我看到好多都是从下往上遍历的,但我的想法是,倒推回去,每个值都可以从正上方、左上方、右上方来,所以当前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
666
点赞 回复 分享
发布于 2020-08-27 21:11
太强了
点赞 回复 分享
发布于 2020-08-27 21:08

相关推荐

其实本来打算等lastday的时候再写的,但是现在提笔写下这篇总结完全是出于自己的想法,今天上午自己被学校发的签到吵醒时才突然想明白了很多事情,遂决定写下本文进行总结,虽然现在顶多算2.5个月,但也大差不差喵。回看这段时间的日常实习,我的关键词是:遗憾,焦虑。当然也有快乐的时候,不过大部分时间都是前面这两种情绪主导。为了避免后人再次踩坑,我将在本文详细解释我遇到的困难&nbsp;+&nbsp;产生的原因&nbsp;+&nbsp;应对的措施。同时总结新人实习时除了业务本身,还有如何处理生活与工作上的平衡,调控自身的情绪,让自己恢复到最好的工作状态。本文不会教你实习怎么去做产出,因为有产出的前提是你的心态足够健康,且在工作之余还有时间去...
wuwuwuoow:你的经历跟挺像,但我实力远没你强,现在只能干外包。但解决焦虑这块我应该比你更有经验,因为我曾经也非常迷茫和焦虑: 1.规律作息。无论节假日,都必须在同一时间点睡觉,同一时间点起床。放假睡的多,工作睡的少,这就是典型的作息不规律。将直接干扰前额叶皮层功能,导致情绪波动(易怒、焦虑)。无论上班还是周末,我都是 11:30 睡,7 点起床。7.5h 睡眠,完全足够了。 2.运动。缓解压力,强身健体,提高免疫力。不要觉得每天没有时间锻炼,都是懒惰的借口。 3.冥想。长期练习会增厚前额叶皮层(理性决策区),缩小杏仁核体积(减少情绪过敏反应,核心),增强情绪调控能力。 方法很简单,任何时候都能做。就是闭上眼睛,只专注自己的呼吸,不去想其他任何事情。你可以尝试一下,你会发现非常难只专注呼吸,会有大量的想法涌现出来(什么走马灯),不要去压抑它们,而是放平心态,把注意力继续放在呼吸上面。 而且最重要的是,冥想让你学会“活在当下”。因为处于冥想的你,除了专注呼吸你还能做什么呢?你什么都做不了。生活也是这样,我们无法改变过去,无法预知未来会发生什么,我们能做的只有手头的事情,除此之外什么都别想,因为你无法去改变它们。 4.工作与生活分离。工作不是生活的全部,生活可不是只有工作。像我放假的时候,从不带电脑回去。放假该玩就玩吧。 上面要是都能做到,其实完全解决不了你工作上的问题,完不成的需求还是完不成,面试该挂还是得挂。不过呢,当你再次迷茫,再次焦虑的时候,你会发现,诶,还好,没这么难受。比如面试挂了,可能以前的你会感觉非常难受。但如果你做到以上 4 点,你还是会难受的,但其实又没这么难受,可能你会这样想:既然挂了我还能怎么样?这公司不要我,有的是公司要我!
投递腾讯等公司7个岗位 >
点赞 评论 收藏
分享
可以不说话:笔试a了3道半,今天说是挂了😭😭
投递汇丰科技等公司8个岗位
点赞 评论 收藏
分享
评论
10
32
分享

创作者周榜

更多
牛客网
牛客企业服务