华为OJ——iNOC产品部-杨辉三角的变形

题目描述

             1
          1  1  1
       1  2  3  2  1
    1  3  6  7  6  3  1
 1  4  10 16 19  16 10  4  1

  以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数左上角数到右上角的数3个数之和(如果不存在某个数,认为该数就是0)。
  
  求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
输入n(n <= 1000000000)

  • 输入描述:

    输入一个int整数

  • 输出描述:

    输出返回的int值

  • 示例1

    输入
      4
    输出
      3

实现代码:

  • 方法一:
    思路:
    ①补零,使之成为方形
    ②只需要初始化第一行的中间的数为1(事实上就是第一个数,因为补了零之后,就变成了中间的数)
     以及最后一行的一个数和最后的一个数,避免越界
    ③根据每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。 得到公式:a[i][j]=a[i-1][j-1]+a[i-1][j]+a[i-1][j+1];即可得出补零之后的杨辉三角
package cn.c_shuang.demo51;

import java.util.Scanner;
/**
 * iNOC产品部-杨辉三角的变形
 * @author Cshuang
 *  */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            int[][]a=new int[n][2*n-1];
            //将杨辉三角补0,使之变为长方形
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < 2*n-1; j++) {
                    a[i][j]=0;
                }
            }
            a[0][n-1]=1;//第一行中间的数为1
            a[n-1][0]=a[n-1][2*n-2]=1;//第n行的第一个数和最后一个数为1

            for (int i = 1; i < n; i++) {
                //之所以只到了2n-2,避免越界,因为每一行有2n-1个元素,而除了最后一行外,其他行的第2n-1个元素是0
                //而最后一行的最后一个元素(第2n-1个元素,编号2n-2)已经初始化,所以可以跳过去
                for (int j = 1; j < 2*n-2; j++) {
                    a[i][j]=a[i-1][j-1]+a[i-1][j]+a[i-1][j+1];
                }
            }
            for (int i = 0; i < 2*n-1; i++) {
                if(a[n-1][i]%2==0&&a[n-1][i]!=0){
                    System.out.println(i+1);
                    break;
                }else if(i==2*n-2){
                    System.out.println(-1);
                }
            }
        }
        in.close();
    }
}
  • 方法二:

    思路:纯粹看第一个偶数的规律

package cn.c_shuang.demo51_1;

import java.util.Scanner;
/**
 * iNOC产品部-杨辉三角的变形
 * @author Cshuang
 * 看规律
 */
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            if(n<=2)
                System.out.println(-1);
            else if(n%2==1)
                System.out.println(2);
            else if(n%4==0)
                System.out.println(3);
            else
                System.out.println(4);
        }
        in.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值