您的位置:首页 > 其它

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

2017-07-25 14:04 295 查看
题目描述

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
[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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 杨辉三角 查找