京东笔试8.27(Java开发)

第一题

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

例如 n 等于 5 时,答案为 23。

因为升序排序依次为 2,3,5,22,23。。。所以第5个数字为23.

思路:

N<=3特殊处理,N>3时,先将2,3,5加入列表,并使N=N-3,
每次循环先记录列表长度size,从2,3,5中一次取一个数num,如num=2,列表中为22,23,25,则可依次组成222,223,225,每生成一个数执行N=N-1,当N==0及当前生成的数为所求的数,N!=0就将该数加入列表末端;
当2,3,,5都遍历完再将列表前size个数移除;

public class Test {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();
        long result=getResult(n);
        System.out.print(result);
    }
    static int[] nums={2,3,5};
    private static long getResult(int n) {
        if (n<=0)return -1;
        if(n==1)return 2;
        if(n==2)return 3;
        if(n==3)return 5;
        List<Long> list=new LinkedList<Long>();
        list.add(2L);
        list.add(3L);
        list.add(5L);
        n-=3;
        while (!list.isEmpty()&&n>0){
            int size=list.size();
            for (int i = 0; i < nums.length; i++) {
                long num=nums[i];
                for (int j = 0; j < size; j++) {
                    long item=Long.valueOf(num+""+list.get(j));
                    n--;
                    if (n==0){
                        return item;
                    }
                    list.add(item);
                }
            }
            for (int i = 0; i < size; i++) {
                list.remove(0);
            }
        }
        return -1;
    }
}

第二题

某滚球游戏规则如下:球从入口处(第一层)开始向下滚动,每次可向下滚动一层,直到滚至最下面一层为止。球每次可滚至左下、下方或右下三个方格中的任意一个,每个方格都有一个得分,如下图所示。第1层有1个方格,第2层有3个方格,……,以此类推,第n层有2*n-1个方格。设计一个算法,使得球从入口滚至最下面一层的总得分和最大

思路

从倒数第二层开始遍历,nums[i][j]=max(nums[i+1][j-1],nums[i+1][j],nums[i+1][j+1])+nums[i][j];然后返回nums[0][nums.length-1],
public class Test2 {
    public static void main(String[] args) {

        Scanner input=new Scanner(System.in);
        int n=input.nextInt();
       if (n>=1){
           long[][] nums=new long[n][2*n-1];
           for (int i = 0; i < n; i++) {
               int startIndex=n-i-1;
               for (int j = 0; j <2*(i+1)-1; j++) {
                   nums[i][startIndex++]=input.nextInt();
               }
           }
           long result=getResult(nums);
           System.out.println(result);
       }else {
           System.out.println(-1);
       }
    }

    private static long getResult(long[][] numbers) {
        for (int i = numbers.length - 2; i >=0 ; i--) {
            int start=numbers.length-i-1;
            for (int j = 0; j < (i+1) * 2 - 1; j++) {
                numbers[i][start]+=Math.max(numbers[i+1][start-1],Math.max(numbers[i+1][start],numbers[i+1][start+1]));
                start++;
            }
        }
        return numbers[0][numbers.length-1];
    }
}
下面的代码需要n*n的矩阵进行存储,其实还可以优化,直接只存输入的数就行了列入
i=0--1
i=1--1 2 1
i=2--2 3 4 1 3
i=3--5 2 4 6 7 8 6
nums[i][j]=max(nums[i+1][j-1],nums[i+1][j],nums[i+1][j+1])+nums[i][j];然后返回nums[0][nums.length-1],




#笔经##京东#
全部评论

相关推荐

10-15 16:27
门头沟学院 C++
LeoMoon:建议问一下是不是你给他付钱😅😅
点赞 评论 收藏
分享
评论
2
6
分享
牛客网
牛客企业服务