问题描述
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)
本题有多组输入数据,输入到文件末尾,请使用while(cin>>)等方式读入
输入描述:
输入一个int整数
输出描述:
输出返回的int值
示例
示例1
输入
4
2
输出
3
-1
解决思路
分析
问题的关键在找规律,通过多列举几列会发现规律;也可以通过递归暴力解决。
方法
行数 | 内容 | 第一个偶数的位置 |
---|---|---|
1 | 1 | -1 |
2 | 1 1 1 | -1 |
3 | 1 2 3 2 1 | 2 |
4 | 1 3 6 7 6 3 1 | 3 |
5 | 1 4 10 16 19 16 10 4 1 | 2 |
6 | 1 5 15 30 45 51 45 30 15 5 1 | 4 |
7 | 1 6 21 50 90 136 141 136 90 50 21 6 1 | 2 |
8 | 1 137 … |
- 通过上图列举的会发现有规律可循,第一行和第二行默认没有值;往下的奇数行第一个偶数的位置是2;往下的能整除4的行,第一个偶数的位置是3;其他是4
- 通过递归实现,从该行的第一个数挨个判断
代码实现
// 思路1实现
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int x=sc.nextInt();
System.out.println(get(x));
}
}
public static int get (int a) {
if (a == 1 || a == 2) {
return -1;
} else if (a % 2 == 1) { // 奇数
return 2;
} else if (a % 4 == 0) { // 4的倍数
return 3;
} else {
return 4;
}
}
}
// 思路2实现
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int x=sc.nextInt();
System.out.println(get(x));
}
}
public static int getNum(int n, int k) {
// 第一个和最后一个返回1
if (k == 1 || k == n * 2 - 1)
return 1;
// 范围外的返回0
if (k < 1 || k > n * 2 - 1)
return 0;
// 范围内的计算,分别取上一行的左上角,上一行的中间,上一行的右上角
else
return getNum(n - 1, k - 2) + getNum(n - 1, k - 1) + getNum(n - 1, k);
}
// n行数
// j每行挨个遍历
public static int get(int n) {
for (int j = 1; j <= 2 * n - 1; j++) {
// 挨个判断是否是偶数
if (getNum(n, j) % 2 == 0) {
return j;
} else if (j == 2 * n - 1) {// 判断到最后,没有,则返回-1
return -1;
}
}
return -1;
}
}
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试