Java题解 | HJ53 #杨辉三角的变形#

杨辉三角的变形

https://www.nowcoder.com/practice/8ef655edf42d4e08b44be4d777edbf43

描述

cke_113.png

以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。

求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3,输入2则输出-1。

数据范围:

输入描述:

输入一个int整数

输出描述:

输出返回的int值

解法

该题转为了,第n行的数字序列是什么?如果求得了第n行的数字序列,那么从这个数字序列里面找第1个偶数就简单了。

那么如何来生成第n行的数字序列?

观察得知,第n行是上一行个数加2,就是说,第n行有(n-1)*2 +1 个数字,上述问题可以转为了n 乘以 (n-1)*2 +1 的矩阵问题。

        
  • 矩阵为空的赋值0;
  •     
  • 计算时先算第1行,再算第2行,因此类推,算到n行为止。
  •     
  • 每行的数字序列都是左右对称的,先找到要计算的起止位置。开始位置是上一行的开始位置左移一位;截止位置是上一行的截止位置右移一位

 

/*
 * Copyright (c) waylau.com, 2022. All rights reserved.
 */

package com.waylau.nowcoder.exam.oj.huawei;

import java.util.Scanner;

/**
 * HJ53 杨辉三角的变形.
 * 描述
 * 以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,
 * 左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
 * 求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
 * 输入n(n <= 1000000000)
 * 本题有多组输入数据,输入到文件末尾,请使用while(cin>>)等方式读入
 * 输入描述:输入一个int整数
 * 输出描述:输出返回的int值
 * 示例1
 * 输入
 * 4
 * 输出
 * 3
 *
 * @author <a href="https://waylau.com">Way Lau</a>
 * @since 2022-08-26
 */
public class HJ053DeformationOfYanghuiTriangle {
    public static void main(String[] args) {
        // 输入
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        // 输出
        System.out.println(getResult(n));

        // 关闭
        in.close();
    }

    private static int getResult(int n) {
        int m = (n - 1) * 2 + 1; // 矩阵的列数。

        // 矩阵为空的赋值0;
        int[][] arr = new int[n][m];

        // 中间索引位置
        int mid = m / 2;

        //计算时先算第1行,
        arr[0][mid] = 1;

        // 起止位置
        int start = mid;
        int end = mid;

        // 再算第2到n行,因此类推,算到n行为止。
        for (int i = 1; i < n; i++) {
            start--;
            end++;
            for (int j = start; j <= end; j++) {
                // 上一行的左、中、右 值
                // 需要考虑边界
                int previousLeft = j - 1 < 0 ? 0 : arr[i - 1][j - 1];
                int previousMid = arr[i - 1][j];
                int previousRight = j + 1 > n ? 0 : arr[i - 1][j + 1];

                // 上一行的左、中、右 值相加
                arr[i][j] = previousLeft + previousMid + previousRight;
            }
        }

        // 取最后一行遍历,找出偶数后返回
        for (int i = 1; i < m; i++) {
            int v = arr[n - 1][i];

            // 判断是偶数
            if (v % 2 == 0) {
                return i + 1;
            }
        }

        return -1;
    }
}
	

上面的逻辑本身没有问题,但在运行测试用例时候,发生了OOM。这意味着随着规模数的增加,内存的占用到了无法接受的地步。

cke_45268.png

最后只能是路走偏锋,采用寻找规律法

/*
 * Copyright (c) waylau.com, 2022. All rights reserved.
 */

package com.waylau.nowcoder.exam.oj.huawei;

import java.util.Scanner;

/**
 * HJ53 杨辉三角的变形.
 * 描述
 * 以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,
 * 左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
 * 求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
 * 输入n(n <= 1000000000)
 * 本题有多组输入数据,输入到文件末尾,请使用while(cin>>)等方式读入
 * 输入描述:输入一个int整数
 * 输出描述:输出返回的int值
 * 示例1
 * 输入
 * 4
 * 输出
 * 3
 *
 * @author <a href="https://waylau.com">Way Lau</a>
 * @since 2022-08-26
 */
public class HJ053DeformationOfYanghuiTriangle2 {
    public static void main(String[] args) {
        // 输入
        Scanner in = new Scanner(System.in);
        
        // 观察规律法
        while (in.hasNextInt()) {
            int num = in.nextInt();
            if(num == 1 || num == 2){
                System.out.println(-1);
                continue;
            }
            else if(num % 4 == 1 || num % 4 == 3){
                System.out.println(2);
                continue;
            }
            else if(num % 4 == 0){
                System.out.println(3);
                continue;
            }
            else if(num % 4 == 2){
                System.out.println(4);
                continue;
            }
        }
        // 关闭
        in.close();
    }
}
	

参考引用

* 本系列归档至<https://github.com/waylau/nowcoder-exam-oj>

* 《Java 数据结构及算法实战》:<https://github.com/waylau/java-data-structures-and-algorithms-in-action>

* 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):<https://item.jd.com/13014179.html>

#华为机考#
全部评论

相关推荐

手撕没做出来是不是一定挂
Chrispp3:不会,写出来也不一定过
点赞 评论 收藏
分享
点赞 评论 收藏
分享
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-26 18:54
说等下个版本吧的发呆爱好者很贪睡:佬最后去了哪家呀
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务