**
算法题系列:1 3 6 10 15 2 5 9 14 4 8 13 7 12 11
**
算法题系列,开了几个系列,都只有一两篇,加油,慢慢写,补充自己。
这是前段时间在看的一道算法题,现在来分享一下,题目送上。
/*
输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
*/
方法1
/*
* Method01:将每行的第一位数字与其后面的数字分开输出。
* 每行的第一位数字的输出使用(a+=(b++)),例如:第一行(a=1,b=0,此时(a+=(b++))输出为1;第二行(a=1,b=1,此时(a+=(b++))输出为2,以此类推)。
* 每行数字都是按照递增规律,所以每行除第一位数字的其余数字输出使用使用(m+=(++n)),例如:第一行第二个(m=1,n=1,此时(m+=(++n))输出为3,以此类推)。
* */
int a = 1,b = 0;
int m = 1,n = 1;
for(int i = 1;i<=5;i++) {//外循环控制行数,这里是五行
System.out.print((a+=(b++))+"\t");
m = a;
int j;
for(j = 5;j>i;j--) {//内循环控制每行除第一位数字外的其余数字个数
System.out.print((m+=(++n))+"\t");
}
n=i+1;//下一行数重新赋值新的数字
System.out.println();
}
System.out.println();
方法二
/*
* Method02:采用二维数组的方式,但这个并不是按照行顺序给数组赋值的,例如:(row=0时,ary[0][0];row=1时,ary[1][1],ary[0][1],以此类推)
* */
int[][] ary = new int[5][5];
int num = 1;
for(int row = 0; row < ary.length; row++){
for(int i = row, col = 0; i >= 0; i--){
ary[i][col++] = num++;
}
}
for(int[] aryItem : ary){
for(int value: aryItem){
if(value != 0){
System.out.print(value + "\t");
}
}
System.out.println();
}
System.out.println();
``
方法三:
/*
* Method03:跟Method01有一点异曲同工,但还是有点不一样的,也可以算是一种思路
* Method03的内外循环和Method01的内外循环顺序不一样
* Method03使用一条输出语句,Method01将每行的第一位数字和其其余分开输出,两条输出语句
* */
int key = 1,num = 0;
int num_first = 1,num_row = 1;
for (int i = 5; i >= 1; i--) {
num = num_first;
key = num_row + 1;
for (int j = 1; j <= i; j++) {
System.out.print(num + "\t");
num += key;
key++;
}
System.out.println();
num_first+=num_row;
num_row++;
}
System.out.println();
运行速度测试
使用的是System.nanoTime();方法取得纳秒值,可能会根据运行次数以及配置等问题有所误差。
Method01方法耗时:863300纳秒
Method02方法耗时:715300纳秒
Method03方法耗时:1256800纳秒
参考:
https://zhidao.baidu.com/question/487808374.html
https://www.zuoyesou.com/question/javawt.html