zoukankan      html  css  js  c++  java
  • [算法]方正面试题: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 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 }
    放在首页得瑟一下,为的是求到更好算法,请大家猛烈拍砖!
    敬告

    作者:pangxiaoliang
    出处:http://www.cnblogs.com/pangxiaoliang
    本文版权归pangxiaoliang和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。
  • 相关阅读:
    CentOS下添加sudo用户
    CentOS查看你是否有USB 3.0端口
    CentOS查看操作系统信息(重要)
    JStack分析cpu消耗过高问题
    Java内存管理和垃圾回收
    kafka学习之-深入研究原理
    kafka学习之-文件存储机制
    kafka学习之-配置详解
    Hbase学习之javaApI封装
    linux中top命令
  • 原文地址:https://www.cnblogs.com/pangxiaoliang/p/1530084.html
Copyright © 2011-2022 走看看