再来讨论一下Fackbook的那道面试题

justinavril 2009-12-21 10:30:01
我想看过那个帖子的人应该都还记得吧?原命题是:
/*
矩阵A
68 36 22
59 77 39
81 20 17
将矩阵A每列排序之后(升序排列)应该得到的矩阵是:
矩阵B:
59 20 17
68 36 22
81 77 39
这样矩阵A中每个元素在矩阵B中对应的位置就是
矩阵C:
2 3 3
1 1 1
3 2 2
问:由矩阵A得到矩阵C的算法?
*/

在自己的blog里(详见"关于返回二维数组排序后序号数组的问题求解"),将这个问题扩展到了不规则数组中,也就是说算法应该能解决如下问题:
/*
矩阵A
68 36 22
59 77
81
将矩阵A每列排序之后(升序排列)应该得到的矩阵是:
矩阵B:
59 36 22
68 77
81
这样矩阵A中每个元素在矩阵B中对应的位置就是
矩阵C:
2 1 1
1 2 2
3
问:由矩阵A得到矩阵C的算法?
*/

不知道各位能不能提供更好地解法。大冬天的,大家热烈讨论吧!关于blog的一些错误,也欢迎指正!
...全文
352 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
SambaGao 2009-12-24
  • 打赏
  • 举报
回复
有时间再研究吧。
wangleileo 2009-12-24
  • 打赏
  • 举报
回复
学习了!
mxc1225 2009-12-24
  • 打赏
  • 举报
回复
学习了!?
justinavril 2009-12-24
  • 打赏
  • 举报
回复
哎 没人讨论 那大家就当是散分贴吧
justinavril 2009-12-22
  • 打赏
  • 举报
回复
现在怎么老有人不看帖子就回答 哎

[Quote=引用 19 楼 fztjava 的回复:]
这些还要说吗?主要思想都出来了,剩下自己搞定
private static void method1() {
int[][] aa = { { 68, 36, 22 }, { 59, 77, 39 }, { 81, 20, 17 } };
int[][] po = new int[aa.length][aa[0].length];

// 给index数组赋初始值
for (int i = 0; i < aa.length; i++) {
for (int j = 0; j < aa[i].length; j++) {
po[i][j] = i + 1;
}
}

int temp;
for (int i = 0; i < aa.length; i++) {
for (int j = aa.length - 1; j > 0; j--) {
for (int k = 0; k < j; k++) {
if (aa[k][i] > aa[k + 1][i]) {
temp = aa[k][i];
aa[k][i] = aa[k + 1][i];
aa[k + 1][i] = temp;

temp = po[k][i];
po[k][i] = po[k + 1][i];
po[k + 1][i] = temp;
}
}
}
}
}
[/Quote]
fztjava 2009-12-22
  • 打赏
  • 举报
回复
这些还要说吗?主要思想都出来了,剩下自己搞定
private static void method1() {
int[][] aa = { { 68, 36, 22 }, { 59, 77, 39 }, { 81, 20, 17 } };
int[][] po = new int[aa.length][aa[0].length];

// 给index数组赋初始值
for (int i = 0; i < aa.length; i++) {
for (int j = 0; j < aa[i].length; j++) {
po[i][j] = i + 1;
}
}

int temp;
for (int i = 0; i < aa.length; i++) {
for (int j = aa.length - 1; j > 0; j--) {
for (int k = 0; k < j; k++) {
if (aa[k][i] > aa[k + 1][i]) {
temp = aa[k][i];
aa[k][i] = aa[k + 1][i];
aa[k + 1][i] = temp;

temp = po[k][i];
po[k][i] = po[k + 1][i];
po[k + 1][i] = temp;
}
}
}
}
}
justinavril 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 crazylaa 的回复:]

[/Quote]
别光顶嘛 都来想想嘛
晴天1999 2009-12-22
  • 打赏
  • 举报
回复
新手哈!多多指教哟!
crazylaa 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 justinavril 的回复:]
引用 17 楼 crazylaa 的回复:


别光顶嘛  都来想想嘛
[/Quote]

算法不会啊,只好顶了。

zhanghuaigong 2009-12-21
  • 打赏
  • 举报
回复
jf
double6633 2009-12-21
  • 打赏
  • 举报
回复
确实比较勒强·。
dongyangmoney 2009-12-21
  • 打赏
  • 举报
回复
jf
fsfszm254 2009-12-21
  • 打赏
  • 举报
回复
还是有用的
ScAREcrOw_ss 2009-12-21
  • 打赏
  • 举报
回复
[Quote]
上大学时挺爱研究这个的。现在觉得没什么用,所以提不起兴趣了。。。。
[/Quote]
ScAREcrOw_ss 2009-12-21
  • 打赏
  • 举报
回复
上大学时挺爱研究这个的。现在觉得没什么用,所以提不起兴趣了。。。。
sean1203 2009-12-21
  • 打赏
  • 举报
回复
sean1203 2009-12-21
  • 打赏
  • 举报
回复
justinavril 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zb309698998 的回复:]
先把A转置后好像更容易控制些,解不规则矩阵好像容易。
[/Quote]
开始我也想转置 但是一想数学上的转置很容易 但是程序里的遍历还是效率比较低的

所以整个的算法需要在2个地方体现效率,一个是遍历行元素,二是排序
三米 2009-12-21
  • 打赏
  • 举报
回复
先把A转置后好像更容易控制些,解不规则矩阵好像容易。
三米 2009-12-21
  • 打赏
  • 举报
回复
想了一个很笨的方法,首先把A每一列排序得到B 然后让B列中元素和A中相应列相比较找出它所在A相应列的行坐标并替换这个元素。循环就要从列开始了。
抛砖引玉, 我是菜鸟,大侠莫怪~~~
加载更多回复(6)

62,614

社区成员

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

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