java算法征方案

downmoon 2010-07-02 03:21:43
输入一个int32类型参数n,n>1

按如下的例子控制台输出:

n=1:

1 1

1 1

n=2:

1 1 1

1 2 1

1 1 1

n=3:

1 1 1 1

1 2 2 1

1 2 2 1

1 1 1 1

n=4:

1 1 1 1 1

1 2 2 2 1

1 2 3 2 1

1 2 2 2 1

1 1 1 1 1
...全文
362 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
musiclee 2010-07-06
  • 打赏
  • 举报
回复
晕 这种题 还讨论着多。。。。
downmoon 2010-07-05
  • 打赏
  • 举报
回复
downmoon 2010-07-04
  • 打赏
  • 举报
回复
阿根廷,请不要为我哭泣!
晚上结帖!
lizhongyi188 2010-07-03
  • 打赏
  • 举报
回复
中国人的脑子 还是不错的!
sunzhenxu555 2010-07-03
  • 打赏
  • 举报
回复
高手真多啊
Headsen 2010-07-03
  • 打赏
  • 举报
回复
1 1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 3 3 3 2 1
1 2 3 4 4 4 4 4 4 3 2 1
1 2 3 4 5 5 5 5 4 3 2 1
1 2 3 4 5 6 6 5 4 3 2 1
1 2 3 4 5 6 6 5 4 3 2 1
1 2 3 4 5 5 5 5 4 3 2 1
1 2 3 4 4 4 4 4 4 3 2 1
1 2 3 3 3 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1

所有这类题一旦搞定规律都可以轻松解决。
Headsen 2010-07-03
  • 打赏
  • 举报
回复
这种题的核心就是根据规律抽取出算术表达式!谈不上算法,只是看抽象能力而已。
抽象程度越高算法越精简。
第一步:规律
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();
}


说明抽象的逻辑不一样程序的思路也不一样。抽象的越简单 程序也就越简单。
当然抽象越简单有时候伴随着的是难以理解。
NickCheng 2010-07-03
  • 打赏
  • 举报
回复
knakanluguo......
funfun5433 2010-07-03
  • 打赏
  • 举报
回复
n=1的时候2行2列 n=2的时候3行3列 以此类推 输出的时候 第一行、最后一行、第一列、最后一列为1 其余为2
jinianjun 2010-07-03
  • 打赏
  • 举报
回复
高手如云啊
zheng192004 2010-07-03
  • 打赏
  • 举报
回复
哇塞~都挺牛XX的,偶像~~我来学习学习!!O(∩_∩)O~
Headsen 2010-07-03
  • 打赏
  • 举报
回复
优化一下,上面可读性好,但是代码太庞大。

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();
}
}
}

Headsen 2010-07-03
  • 打赏
  • 举报
回复
汗!果然看错题目!打印了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();
}
}

}




[Quote=引用 37 楼 lwb314 的回复:]
理论说了很多但是题没做对,还是说你看错题了
[/Quote]
24K純帥 2010-07-03
  • 打赏
  • 举报
回复
恩,顶6L
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 headsen 的回复:]
1 1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 3 3 3 2 1
1 2 3 4 4 4 4 4 4 3 2 1
1 2 3 4 5 5 5 5 4 3 2 1
1 2 3 4 5 6 6 5 4 3 2 1
1 2 3 4 5 6 6 5 4 3 2 1
1 2 3 4 5 5 5 5 4 ……
[/Quote]
理论说了很多但是题没做对,还是说你看错题了
n=6时的结果是:
1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 2 3 3 3 2 1
1 2 3 4 3 2 1
1 2 3 3 3 2 1
1 2 2 2 2 2 1
1 1 1 1 1 1 1
你的是
1111111111
1222222221
1233333321
1234444321
1234554321
1234554321
1234444321
1233333321
1222222221
1111111111
zhanlang9075 2010-07-02
  • 打赏
  • 举报
回复
关注此贴,对算法很有点兴趣。
aptweasel 2010-07-02
  • 打赏
  • 举报
回复
不好意思,看错了,比杨辉三角还简单呢!
aptweasel 2010-07-02
  • 打赏
  • 举报
回复
不就是杨辉三角正着打一遍,反着再打一遍吗!有那么难吗?
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 keeya0416 的回复:]
我那个没有取余运算
只是几次加减 再取的较小者
[/Quote]
恩,看错了,不过我觉得应该是比较大小用的时间比较长,你每次循环都比较3次,就算是3个if循环下来估计也要不少时间,思路也没太看明白,明天早上起来再好好看看

public static void printMap(int num){
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
焙焙龙 2010-07-02
  • 打赏
  • 举报
回复
OK,今天心情比较郁闷,晚一点写好发上来吧
加载更多回复(25)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧