int d = 6;//输入的给定输,1234567等 int k = 6;//最大值范围, int c = 0;//最小值范围 int a[][] = new int[d+1][d+1]; int aa = k/2+1; for(int l=0;l<aa;l++) { for(int i=c;i<=k;i++) { for(int j=c;j<=k;j++) { a[i][j] +=1; } } k -=1; c +=1; } for(int i=0;i<=d;i++) { for(int j=0;j<=d;j++) { System.out.print(a[i][j]); } System.out.println(); } }
被人抢了 public static void printMap(int num){ for (int i = 0; i < num + 1; i++) { for (int j = 0; j < num + 1; j++) { System.out.printf("%d ",Math.min(Math.min(i + 1, num - i + 1), Math.min(j + 1, num - j + 1))); } System.out.println(); } }
你每次做一个取余预算我7*7的数组你用了49次预算,我并没有进行那么复杂的运算啊 我的代码参数为100的时候运行完是78ms,你的是328ms,你自己试一下吧 public static void main(String[] args) { long s = System.currentTimeMillis(); int d = 100;//输入的给定输,1234567等 int k = 100;//最大值范围, int c = 0;//最小值范围 int a[][] = new int[d+1][d+1]; int aa = k/2+1; for(int l=0;l<aa;l++) { for(int i=c;i<=k;i++) { for(int j=c;j<=k;j++) { a[i][j] +=1; } } k -=1; c +=1; } for(int i=0;i<=d;i++) { for(int j=0;j<=d;j++) { System.out.print(a[i][j]); } System.out.println(); } // printMap(100); long e = System.currentTimeMillis(); System.out.println(e-s); }
汗!果然看错题目!打印了2n矩阵,貌似n+1矩阵就可以。 不过这类题的思路和分析方法不会错的。这个更简单更容易理解(但愿没看错这次):借我上遍思路package interview;public class TestPrint2 { public static int getMinDistance(int n,int x,int y){ int west = x; int east = n+2-x; int north = y; int south = n+2-y; int xd = west<east?west:east; int yd = north<south?north:south; return xd<yd?xd:yd; } public static void main(String[] args) { int n=3; for(int i=1;i<=n+1;i++){ for(int j=1;j<=n+1;j++){ int xx = TestPrint2.getMinDistance(n, i, j); System.out.print(xx); } System.out.println(); } }}
优化一下,上面可读性好,但是代码太庞大。public class TestPrint2 { public static void main(String[] args) { int n=3; for(int i=1;i<=n+1;i++){ for(int j=1;j<=n+1;j++){ int xx = Math.min(Math.min(i,j),Math.min(n+2-i, n+2-j)); System.out.print(xx); } System.out.println(); } } }
public static void main(String[] args) {
int d = 6;//输入的给定输,1234567等
int k = 6;//最大值范围,
int c = 0;//最小值范围
int a[][] = new int[d+1][d+1];
int aa = k/2+1;
for(int l=0;l<aa;l++)
{
for(int i=c;i<=k;i++)
{
for(int j=c;j<=k;j++)
{
a[i][j] +=1;
}
}
k -=1;
c +=1;
}
for(int i=0;i<=d;i++)
{
for(int j=0;j<=d;j++)
{
System.out.print(a[i][j]);
}
System.out.println();
}
}
for (int i = 0; i < num + 1; i++) {
for (int j = 0; j < num + 1; j++) {
System.out.printf("%d ",Math.min(Math.min(i + 1, num - i + 1), Math.min(j + 1, num - j + 1)));
}
System.out.println();
}
}
思路就是逐渐的+1,拿n=6,7*7的例子说明,首先矩阵里的所有单位+1,当全部加完的时候,第2轮是向内侧数一圈,也就是横纵坐标的最小值+1,而最大值-1;也就是我定义的k跟c,最后当k/2+1的时候就不再+1了,也就是6/2+1=4,5/2+1=3。大致就是这个思路,用了20分钟左右,好像有点慢呵呵。没办法大学时候线性代数挂科了,基础不好
public static void main(String args[]){
int n = 9;
for(int i = 1-n;i<n;i++){
for(int j = 1-n;j<n;j++){
int absi = Math.abs(i);
int absj = Math.abs(j);
int k = absi>absj?absi:absj;
System.out.printf("%2d",n-k);
}
System.out.println();
}
}
输出:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1
1 2 3 4 4 4 4 4 4 4 4 4 4 4 3 2 1
1 2 3 4 5 5 5 5 5 5 5 5 5 4 3 2 1
1 2 3 4 5 6 6 6 6 6 6 6 5 4 3 2 1
1 2 3 4 5 6 7 7 7 7 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 8 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 8 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 7 7 7 7 6 5 4 3 2 1
1 2 3 4 5 6 6 6 6 6 6 6 5 4 3 2 1
1 2 3 4 5 5 5 5 5 5 5 5 5 4 3 2 1
1 2 3 4 4 4 4 4 4 4 4 4 4 4 3 2 1
1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
我的代码参数为100的时候运行完是78ms,你的是328ms,你自己试一下吧 public static void main(String[] args) {
long s = System.currentTimeMillis();
int d = 100;//输入的给定输,1234567等
int k = 100;//最大值范围,
int c = 0;//最小值范围
int a[][] = new int[d+1][d+1];
int aa = k/2+1;
for(int l=0;l<aa;l++)
{
for(int i=c;i<=k;i++)
{
for(int j=c;j<=k;j++)
{
a[i][j] +=1;
}
}
k -=1;
c +=1;
}
for(int i=0;i<=d;i++)
{
for(int j=0;j<=d;j++)
{
System.out.print(a[i][j]);
}
System.out.println();
}
// printMap(100);
long e = System.currentTimeMillis();
System.out.println(e-s);
}
我那个比你慢 第一是 Math.min 调用太多
第二是 printf 比 print 这个方法要慢很多 你可以试试
class CsdnJavaAlgorithm
{
public static void main(String[] args)
{
/*
用户输入i
行数为i+1,每行为i+1个数
*/
for(int i=1;i<=5;i++){//行数
for(int k=1;k<=5;k++){//每行数字个数
if(i==1||i==5){
System.out.print(1);//第一行和最后一行打印出1;
}else if(k==1||k==5){//每行的第一个和最后一个打出1
System.out.print(1);
}else{
if(i==(3)&&k==(3))//最中间的行的 最中间数打出3
System.out.print(3);
else
System.out.print(5/2);//否则打出2
}
}
System.out.println();
}
}
}
等下把数字改成变量。
没有楼上的高手那么简洁,不过应该比较好理解 public static void print(int num){
for(int i=0;i<=num;i++){
for(int j=0;j<=num;j++){
int min = i<j?i:j;
int max = i>j?i:j;
if(i+j<num){
System.out.print(min+1);
}else{
System.out.print(num-max+1);
}
}
System.out.println();
}
}
public static void main(String[] args) {
print(5);
} 1 1 1 1 1 1
1 2 2 2 2 1
1 2 3 3 2 1
1 2 3 3 2 1
1 2 2 2 2 1
1 1 1 1 1 1
for (int i = 0; i < num + 1; i++) {
for (int j = 0; j < num + 1; j++) {
System.out.print((int)Math.min(Math.min(i + 1, num - i + 1), Math.min(j + 1, num - j + 1)));
}
System.out.println();
}
}
把函数换成这个确实比之前快了,175ms
抽象程度越高算法越精简。
第一步:规律
1、打印行数列数均为:(n-1)*2
2、打印数值,为位置到正方形的最近边距(4个边距中最小的)。
或者距离中心点越近的越大(取距离中心的距离,然后被n-1减一下。)
第二步:抽象出算术逻辑
i,j范围:1--(n-1)*2
到中心点的距离:左右|n-0.5-i| 上下|n-0.5-j|
值:n-最近的距离
第三步:写程序: int n=3;
for(int i=1;i<=(n-1)*2;i++){
for(int j=1;j<=(n-1)*2;j++){
double x= Math.abs(n-0.5-i);
double y= Math.abs(n-0.5-j);
if(x>=y){
System.out.print(n-((int)(x+0.5)));
}else{
System.out.print(n-((int)(y+0.5)));
}
}
System.out.println();
}
说明抽象的逻辑不一样程序的思路也不一样。抽象的越简单 程序也就越简单。
当然抽象越简单有时候伴随着的是难以理解。
不过这类题的思路和分析方法不会错的。这个更简单更容易理解(但愿没看错这次):借我上遍思路package interview;public class TestPrint2 {
public static int getMinDistance(int n,int x,int y){
int west = x;
int east = n+2-x;
int north = y;
int south = n+2-y;
int xd = west<east?west:east;
int yd = north<south?north:south;
return xd<yd?xd:yd;
}
public static void main(String[] args) {
int n=3;
for(int i=1;i<=n+1;i++){
for(int j=1;j<=n+1;j++){
int xx = TestPrint2.getMinDistance(n, i, j);
System.out.print(xx);
}
System.out.println();
}
}}
public static void main(String[] args) {
int n=3;
for(int i=1;i<=n+1;i++){
for(int j=1;j<=n+1;j++){
int xx = Math.min(Math.min(i,j),Math.min(n+2-i, n+2-j));
System.out.print(xx);
}
System.out.println();
}
}
}
http://blog.csdn.net/downmoon/archive/2010/07/05/5712679.aspx