[算法]方正面试题:N×N矩阵螺旋打印输出
话说昨日和老婆吵架,被老婆关在门外,数次求进,无果。无奈,暂避于同租同学小王之室,无聊中突想起去年面试时在方正公司的面试上机题——N×N矩阵螺旋打印输出,如下:
例:
1 2 3
4 5 6
7 8 9
输出为如下结果
1;4;7;8;9;6;3;2;5;
当时方正笔试题出得有些让人摸不到头脑,全英文,与开发无太多关系,感觉不是在面试软件工程师职位,倒像是招聘翻译。心中已有些不爽,后来一个个去面试,还是没问技术,反而问我为什么离职,唉......
最后出了上面的上机题,因为心里不爽,我想了一会儿就去找招聘主管,说了我对这道题的想法,然后要求走人,那主管挽留说要我把程序写完,当时强烈感觉不爽,强烈要求走人,后批准,事终。
当时对这道题不解,为什么非要考这种题那,一直以为方正是做XXX系统的,后来才知道方正主要是搞排版,对矩阵运算是有要求的,年轻啊,沉不住气^o^。
附:当时认为是要找一个规律,找到一维数组和二维数组的映射,然后循环一维数组,根据一维数组的索引直接推断出二维数组的索引并输出。
昨天找了张纸,画了半天都没找到两者之间的关系,发此文的重要目的是找到一种更好的算法,请大家一起来解决。
以下是我想到的算法,献丑了。感觉太Ugly了,期待各位大牛的算法:)
例:
1 2 3
4 5 6
7 8 9
输出为如下结果
1;4;7;8;9;6;3;2;5;
当时方正笔试题出得有些让人摸不到头脑,全英文,与开发无太多关系,感觉不是在面试软件工程师职位,倒像是招聘翻译。心中已有些不爽,后来一个个去面试,还是没问技术,反而问我为什么离职,唉......
最后出了上面的上机题,因为心里不爽,我想了一会儿就去找招聘主管,说了我对这道题的想法,然后要求走人,那主管挽留说要我把程序写完,当时强烈感觉不爽,强烈要求走人,后批准,事终。
当时对这道题不解,为什么非要考这种题那,一直以为方正是做XXX系统的,后来才知道方正主要是搞排版,对矩阵运算是有要求的,年轻啊,沉不住气^o^。
附:当时认为是要找一个规律,找到一维数组和二维数组的映射,然后循环一维数组,根据一维数组的索引直接推断出二维数组的索引并输出。
昨天找了张纸,画了半天都没找到两者之间的关系,发此文的重要目的是找到一种更好的算法,请大家一起来解决。
以下是我想到的算法,献丑了。感觉太Ugly了,期待各位大牛的算法:)
1 using System;
2
3 namespace Landpy
4 {
5 /// <summary>
6 /// Description: print a spiral matrix as n×n
7 /// 1 2 3
8 /// 4 5 6 => 1;4;7;8;9;6;3;2;5
9 /// 7 8 9
10 /// Author: Landpy_pangxiaoliang
11 /// Date: 2009-07-24
12 /// From: http;//www.cnblogs.com/pangxiaoliang
13 /// </summary>
14 class FangZhengExam
15 {
16 static void Main()
17 {
18 Console.WriteLine("Please input a range!");
19
20 int range = 0;
21 if (Int32.TryParse(Console.ReadLine(), out range))
22 {
23 //Init a originated array
24 int[,] printArray = InitPrintArray(range);
25 //Output a originated array
26 OutPrintArray(printArray);
27 Console.WriteLine("-------------------------------------------");
28 //Output new sort array
29 OutputSortArray(printArray);
30 Console.WriteLine("-------------------------------------------");
31 Console.WriteLine("Finish");
32 }
33 else
34 {
35 Console.WriteLine("Erro range!");
36 }
37
38 }
39
40 private static int[,] InitPrintArray(int range)
41 {
42 int[,] printArray = new int[range, range];
43 int tmpValue = 0;
44 for (int y = 0; y < range; y++)
45 {
46 for (int x = 0; x < range; x++)
47 {
48 tmpValue++;
49 printArray[x, y] = tmpValue;
50 }
51 }
52 return printArray;
53 }
54
55 private static void OutPrintArray(int[,] printArray)
56 {
57 int range = printArray.GetUpperBound(0);
58
59 for (int y = 0; y < range + 1; y++)
60 {
61 for (int x = 0; x < range + 1; x++)
62 {
63 Console.Write(printArray[x, y].ToString().PadLeft(3, ' '));
64 if (x != range)
65 {
66 Console.Write("|");
67 }
68 }
69 Console.WriteLine();
70 }
71 }
72
73 private static void OutputSortArray(int[,] printArray)
74 {
75 int range = printArray.GetUpperBound(0);
76 bool flag = true;
77 int x = 0, y = -1;
78 for (int i = range + 1; i > 0; i--)
79 {
80 for (int tmp = 0; tmp < i; tmp++)
81 {
82 if (flag)
83 {
84 y++;
85 }
86 else
87 {
88 y--;
89 }
90 Console.Write(printArray[x, y].ToString() + ";");
91 }
92 for (int tmp = 0; tmp < i - 1; tmp++)
93 {
94 if (flag)
95 {
96 x++;
97 }
98 else
99 {
100 x--;
101 }
102 Console.Write(printArray[x, y].ToString() + ";");
103 }
104 flag = !flag;
105 }
106 }
107 }
108 }
放在首页得瑟一下,为的是求到更好算法,请大家猛烈拍砖!2
3 namespace Landpy
4 {
5 /// <summary>
6 /// Description: print a spiral matrix as n×n
7 /// 1 2 3
8 /// 4 5 6 => 1;4;7;8;9;6;3;2;5
9 /// 7 8 9
10 /// Author: Landpy_pangxiaoliang
11 /// Date: 2009-07-24
12 /// From: http;//www.cnblogs.com/pangxiaoliang
13 /// </summary>
14 class FangZhengExam
15 {
16 static void Main()
17 {
18 Console.WriteLine("Please input a range!");
19
20 int range = 0;
21 if (Int32.TryParse(Console.ReadLine(), out range))
22 {
23 //Init a originated array
24 int[,] printArray = InitPrintArray(range);
25 //Output a originated array
26 OutPrintArray(printArray);
27 Console.WriteLine("-------------------------------------------");
28 //Output new sort array
29 OutputSortArray(printArray);
30 Console.WriteLine("-------------------------------------------");
31 Console.WriteLine("Finish");
32 }
33 else
34 {
35 Console.WriteLine("Erro range!");
36 }
37
38 }
39
40 private static int[,] InitPrintArray(int range)
41 {
42 int[,] printArray = new int[range, range];
43 int tmpValue = 0;
44 for (int y = 0; y < range; y++)
45 {
46 for (int x = 0; x < range; x++)
47 {
48 tmpValue++;
49 printArray[x, y] = tmpValue;
50 }
51 }
52 return printArray;
53 }
54
55 private static void OutPrintArray(int[,] printArray)
56 {
57 int range = printArray.GetUpperBound(0);
58
59 for (int y = 0; y < range + 1; y++)
60 {
61 for (int x = 0; x < range + 1; x++)
62 {
63 Console.Write(printArray[x, y].ToString().PadLeft(3, ' '));
64 if (x != range)
65 {
66 Console.Write("|");
67 }
68 }
69 Console.WriteLine();
70 }
71 }
72
73 private static void OutputSortArray(int[,] printArray)
74 {
75 int range = printArray.GetUpperBound(0);
76 bool flag = true;
77 int x = 0, y = -1;
78 for (int i = range + 1; i > 0; i--)
79 {
80 for (int tmp = 0; tmp < i; tmp++)
81 {
82 if (flag)
83 {
84 y++;
85 }
86 else
87 {
88 y--;
89 }
90 Console.Write(printArray[x, y].ToString() + ";");
91 }
92 for (int tmp = 0; tmp < i - 1; tmp++)
93 {
94 if (flag)
95 {
96 x++;
97 }
98 else
99 {
100 x--;
101 }
102 Console.Write(printArray[x, y].ToString() + ";");
103 }
104 flag = !flag;
105 }
106 }
107 }
108 }