这道面试题谁会吗?我想了好久都没想出来

图片说明

小白一个,说说自己的想法。
第一行一个,第二行两个……
从外围开始看,对于相对地址看 最外围的 a[i][j] 这里i=j;
然后向内再看一层直到最内一层。
每一层 i 不变 最外围就等于 a[0][j-0]

第二层 i 不变 ; 第二层i=1, 最外围就等于 a[1][1]
…… 最后就是 a[3][3]

然后内一层 由于第一层已经填满,第二层的第一个相当于第一层的第一个
每一层 i 不变 最外围就等于 a[1][i-1]=a[1][0]
每一层 i 不变 最外围就等于 a[2][i-1] =a[2][1]
每一层 i 不变 最外围就等于 a[3][i-1] =a[3][2]

再向内一层 第二层满 第三层的第一个相当于 第一层的第一个 依次类推,每进行一次 总会有一层只剩下一个位置,这个位置相当于斜着这一层的第一个
每一层 i 不变 最外围就等于 a[2][j-2]=a[2][0]
每一层 i 不变 最外围就等于 a[3][j-2]=a[3][1]

最后就是 剩下一个 a[3][i-3]=a[3][0]

#include
int main()
{
int i,n,j,a[15][15];
scanf("%d",&n);
for(i=0;i {
a[i][i]=i+1;
for(j=i;j>0;j--)
{
a[i][j-1]=a[i][j]+n-1;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}

设有N列 得出规律
第一列   1
第二列  n+1  2
第三列  n+3  n+2  3
第四列  n+6  n+5  n+4  4
第五列  n+10   n+ 9   n+8  n+7  5
略........................

最外层的是1到 N
里层,
你这样看

n+1
n+3  n+2
n+6  n+5 n+4  //层次为 i 个数为2/((i+1)*i ) -2/((i+1-1)*(i-1))   第一个数为n+2/((i+1)*i )


package demo;
import java.util.Scanner;
public class Demo1 {
public static void main(String args[]){
int[][] array = new int[10][10];
int n; //有几层
Scanner in = new Scanner(System.in);
n = in.nextInt();
array[0][0] = 1; //第一个数为1
System.out.println(array[0][0]);
for(int i=1;i<n;i++){
for(int j=0;j<=i;j++){
if(j==0){
array[i][j] = array[i-1][j]+n-j+1-i;
/**
* 每一行的第一个数与上一行的第一数字的关系 array[i-1][j]+n-j+1-i;
/
System.out.print(array[i][j]+" ");
}else{
array[i][j] = array[i][j-1]-(n-i+j-1);
/
*
* 每一行的后一个数和前一个数字的关系 array[i][j-1]-(n-i+j-1);
*/
System.out.print(array[i][j]+" ");
}

        }
        System.out.println();
    }

}

}

1.递推公式
#include
int main()
{
int i,n,j,a[15][15],k;
scanf("%d",&n);
for(i=0;i {
a[i][i]=i+1;
k=0;
for(j=i;j>0;j--)
{
a[i][j-1]=a[i][j]+n-1-k;//递推公式
k+
}
}
for(i=0;i {
for(j=0;j printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
2.映射
3.#include
int main()
{
int i,n,j,a[15][15],k=1;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<=n-1-i;j++)
{
a[i+j][j]=k;
k++;
//采用映射的方法,a[i+j][j]=[a[i][j],知识点:矩阵的变换
}
}
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}图片说明

分析:
每行第一位数字都是由上一行每一位数字加剩余的行数再加一,
每行第二位数字开始,都是由上一位数字减剩余的行数再它当前位数再加二。

        int hang = 5;   //总共打印行数
        int diyi = 1;   //每行打印第一位数字
        for (int i = 1; hang > 0; i++) {
            int k = diyi;
            for (int j = 0; j < i - 2; j++) {   //控制每行打印数字的位数
                k = k - hang - j;
                System.out.print(k + " ");
            }
            //每行第一位数字由上一行第一位数字+剩余行数+1
            diyi = hang + diyi;
            hang--;
            System.out.println(i);
            if(hang > 0){
                //打印每行第一个数字
                System.out.print(diyi + " ");
            }
        }

修正:
每行第二位数字开始,都是由上一位数字减剩余的行数再减它当前位数再加二。