最近求职,facebook发来入门测试题,其中一道如下:
题意翻译过来大概是求一个矩阵内每个元素排序位置矩阵。举个例子:
矩阵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 2 2
1 3 3
3 1 1
问:由矩阵A得到矩阵C的算法?我目前想法是先将A每一列排序,得到一个只有一列的数组,然后将A中该列元素依次遍历该数组,找到同元素后,用数组中该元素的位置i替换该元素。A中所有列进行同样的操作,生成相应数组,最后将这些数组组成一个矩阵。有更有效率的算法吗?
题意翻译过来大概是求一个矩阵内每个元素排序位置矩阵。举个例子:
矩阵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 2 2
1 3 3
3 1 1
问:由矩阵A得到矩阵C的算法?我目前想法是先将A每一列排序,得到一个只有一列的数组,然后将A中该列元素依次遍历该数组,找到同元素后,用数组中该元素的位置i替换该元素。A中所有列进行同样的操作,生成相应数组,最后将这些数组组成一个矩阵。有更有效率的算法吗?
看了你的算法,和我想的一样。
就是被墙的那个吗?
v就是A矩阵中的相应值,index是行号然后对每列排序时,实际上是对Item排序,大小比较是以v为准,这样排序后生成的矩阵B就可以轻松得到矩阵C了
public static void main(String[] args){
int[][] aa = {{68,36,22},{59,77,39},{81,20,17}};
int[][] bb = new int[3][3];
int[][] pp = new int[3][3];
int pos = 0; for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
bb[j][i] = aa[i][j];
}
} for (int[] b : bb) {
List<Integer> temp = new ArrayList<Integer>();
for (int i = 0; i < 3; i++) {
temp.add(b[i]);
}
Collections.sort(temp);
for (int i = 0; i < 3; i++) {
pos = temp.indexOf(b[i]);
b[i] = pos + 1;
}
} for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
pp[j][i] = bb[i][j];
}
} for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(pp[i][j] + " ");
if (j == 2) System.out.println();
}
}
}}
import java.util.Scanner;
import java.util.*;public class JuZheng {
public static void main(String[] args){
int n=0,m=0;
System.out.println("请输入矩阵的行数和列数:\n");
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
int[][] a=new int[n+1][m+1];
int[][] ans=new int[n+1][m+1];
int[] b=new int[n+1]; b[0]=-32767;
System.out.println("请输入题给矩阵:\n");
int i,j,i1,j1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
a[i][j]=sc.nextInt();
for(j=1;j<=m;j++){
for(i=1;i<=n;i++)
b[i]=a[i][j];
Arrays.sort(b);
for(i1=1;i1<=n;i1++){
for(j1=1;j1<=n;j1++)
if(a[i1][j]==b[j1])
break;
ans[i1][j]=j1; b[j1]=b[0];
}
}
System.out.println("所求的位置矩阵为:");
for(i=1;i<=n;i++){
System.out.println();
for(j=1;j<=m;j++)
System.out.print(ans[i][j]+" ");
}
}
}
运行结果如下:请输入矩阵的行数和列数:3 3
请输入题给矩阵:68 36 22
59 77 39
81 20 17
所求的位置矩阵为:2 2 2
1 3 3
3 1 1
int[][] aa = { { 68, 36, 22 }, { 59, 77, 39 }, { 81, 20, 17 } };
int [][]pos = new int[3][3];
for(int i=0;i<aa.length;i++){
for(int j=0;j<3;j++){
pos[i][j] = 1;
}
}
//找排序后的位置位置
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
if( k != j && aa[k][i]<aa[j][i]){
pos[j][i]++;
}
}
}
}
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
System.out.print(pos[i][j]+"");
System.out.println();
}
}
public class juZheng {
public static void main(String[] args) {
int[][] shuZuA={{68,36,22},{59,77,39},{81,20,17}};
int[][] shuZuC=new int[3][3];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
shuZuC[i][j]=1;
}
int num1=1,num2=1,num3=1;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(shuZuA[0][i]>shuZuA[j][i])
shuZuC[0][i]++;
if(shuZuA[2][i]>shuZuA[j][i])
shuZuC[2][i]++;
shuZuC[1][i]=6/shuZuC[0][i]/shuZuC[2][i];
}
}
for(int m=0;m<3;m++)
{
for(int n=0;n<3;n++)
System.out.print (shuZuC[m][n]+" ");
System.out.println ();
}
}
}
public class Test {
public static void main(String[] args){
int[][] m={
{68,36,22},
{59,77,39},
{81,20,17}
}; int[][] idxM={
{1,1,1},
{2,2,2},
{3,3,3}
};
int rowCnt,colCnt,minVal,idx,temp;
rowCnt=colCnt=m.length;
for(int col=0;col<colCnt;col++){
//选择排序
for(int row=0;row<rowCnt;row++){
minVal=m[row][col];
idx=row;
for(int i=row+1;i<rowCnt;i++){
if(m[i][col]<minVal){
idx=i;
}
}
temp=m[row][col];
m[row][col]=m[idx][col];
m[idx][col]=temp;
temp=idxM[row][col];
idxM[row][col]=idxM[idx][col];
idxM[idx][col]=temp;
}
}
System.out.println("排序后:");
outputMatrix(m);
System.out.println("index矩阵:");
outputMatrix(idxM);
}
public static void outputMatrix(int[][] m){
if(m==null||m.length==0) return;
for(int[] row:m){
for(int item:row){
System.out.print(item+"\t");
}
System.out.print("\n");
}
}
}
有重复的话,建包含数据和位置的类并实现由数据排序的Comparable接口,任选一个O(nlogn)的排序算法对每一列排序
第一篇讲的是如何登陆facebook和外国的网站,
第二篇是关于facebook架构,如何在上面开发属于自己的游戏,和游戏集成的文章的。http://www.docin.com/p-54714220.html
http://www.docin.com/p-46592011.html
function sort(A) {
var len = A.length,
C = new Array(len),
i, j, k, idx;
for (i = 0; i < len; i++) {
C[i] = new Array(len);
for (j = 0; j < len; j++) {
idx = 1;
for (k = 0; k < len; k++) {
if (A[i][j] > A[k][j]) {
idx++;
}
}
C[i][j] = idx;
}
}
return C;
}var m = sort([[68, 36, 22], [59, 77, 39], [81, 20, 17]]);
console.log(m);