习题总结(一)
把之前遇到的一些比较好的习题进行自我总结整理,以后会陆续添加。
一.螺旋数组
打印螺旋矩阵,如果矩阵长度为5,输出结果下图所示
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
C程序员面试宝典上的,两年前看过。
思路:
按照右,下,左,上四个方向依次给数组赋值。
数组最上行,最右列,最下行,最左列依次为0,n-1,n-1,0。
当按照右方向赋值结束时,最上行加1,
当按照下方向赋值结束时,最右列减1,
当按照左方向赋值结束时,最左列加1,
当按照上方向赋值结束时,最下行减1,
实际上,顺序改变初始方向顺序可以输出4个方向的螺旋矩阵。
我的解法如下(java):
public class Poker {private final static int CARD_COUNT = 52;private static String[] CARD_FLOWERS = new String[]{"Spade","Heart","Club","Diamond"};private static String[] CARD_VALUES = new String[]{"A","2","3","4","5","6","7","8","9","10","J","Q","K"};private static String[] CARD_GHOSTS_FLOWERS = new String[]{"ghost","ghost"};private static String[] CARD_GHOSTS_VALUES = new String[]{"Small","Big"};private String flower;private String value;private int index;private static Poker[] _pokers;public String getFlower() {return flower;}public String getValue() {return value;}public int getIndex() {return index;}public Poker(String flower,String value,int index){this.flower = flower;this.value = value;this.index = index;}private static Poker[] getCardsInstance(){if(_pokers != null){return _pokers;}_pokers = new Poker[CARD_COUNT];for(int i = 0;i < CARD_FLOWERS.length;++i){for(int j = 0;j < CARD_VALUES.length;++j){int index = i * CARD_VALUES.length + j;_pokers[index] = new Poker(CARD_FLOWERS[i], CARD_VALUES[j], index + 1);}}for(int i = CARD_GHOSTS_FLOWERS.length - 1;i >= 0;--i){int index = CARD_COUNT - i;_pokers[index - 1] = new Poker(CARD_GHOSTS_FLOWERS[i], CARD_GHOSTS_VALUES[i], index);}return _pokers;}public static Poker[] shufflingCards(){Random random = new Random();Poker[] pokers = getCardsInstance();for(int i = 0;i < pokers.length;++i){int index = random.nextInt(pokers.length);if(i != index){Poker cardTemp = pokers[i];pokers[i] = pokers[index];pokers[index] = cardTemp;}}return pokers;}public String toString(){return this.flower + this.value;}public static void displayPlayerCards(Poker[] poker){final int PLAYERS = 4;for(int i = 1;i <= poker.length;++i){System.out.print(poker[i - 1].toString() + " ");if(i % (poker.length / PLAYERS) == 0)System.out.println();}}}今天暂时就写这么多,以后再补充。
2012.8.29