zoukankan      html  css  js  c++  java
  • 一个简单的算法笔试题目 : 二维数组的顺时针填充的两种实现方法

    定义接口:
    public interface ISpiralNumber {
        
        public int [][] genArray(int i,int j);
    }


    /** * @类功能说明: 非递归方法实现 * @类修改者: * @修改日期: * @修改说明: * @作者:Administrator * @创建时间:2013-3-22 下午10:31:19 * @版本:V1.0 */ public class SpiralNumber implements ISpiralNumber { public static final int MAXSIZE = 100; @Override public int[][] genArray(int i, int j) { if(i < 0 || j < 0 || i > MAXSIZE || j > MAXSIZE){ return null; } int [][] result = new int[i][j]; int up = 0; int down = i-1; int left = 0; int right = j-1; int num = 1; while(up <= down && left <= right){ for(int m = left; m <= right; m++){ result[up][m] = num; num++; } if(up == down) break; up++; for(int m = up; m <= down; m++){ result[m][right] = num; num++; } if(left == right) break; right--; for (int m = right; m >= left; m--) { result[down][m] = num; num++; } down--; for (int m = down; m >= up; m--) { result[m][left] = num; num++; } left++; } return result; } }

    下面是递归方法来实现:
    /**
     * @类功能说明:  二维数组的顺时针填充   递归方法实现
     * @类修改者:
     * @修改日期:
     * @修改说明:
     * @作者:Administrator
     * @创建时间:2013-3-22 下午10:18:42
     * @版本:V1.0
     */
    public class SpiralNumber implements ISpiralNumber {
    	
    	public static final int MAXSIZE = 100;
    	
    	@Override
    	public int[][] genArray(int i, int j) {
    	if(i < 0 || j < 0 || i > MAXSIZE || j > MAXSIZE){
    		return null;
    	}
    	int [][] result = new int[i][j];
    	autoFill(new Point(0,0),1,result);
    	return result;
    }
    	private void autoFill(Point s ,int value , int [][] array ) {
    		if(s!= null ) {
    			array[s.x][s.y] = value ;
    			value = value + 1;
    			Point next = getNextPoint(s,array);
    			autoFill(next,value,array);
    		}
    	}
    	
    	private Point getNextPoint(Point s,int [][] array) {
    		int xMax = array.length;
    		int yMax = array[0].length;
    		boolean left = false ;
    		boolean right = false; 
    		boolean up    =  false;
    		boolean down  =  false ;
    		
    		if (s.y-1 >= 0 && array[s.x][s.y-1] == 0) {
    			left = true;
    		}
    		if (s.y+1 < yMax && array[s.x][s.y+1] == 0 ) {
    			right = true;
    		}
    		if (s.x-1 >= 0  && array[s.x-1][s.y] == 0 ) {
    			up = true;
    		}
    		if (s.x+1 < xMax && array[s.x+1][s.y] == 0 ) {
    			down = true;
    		}
    		if(left && right && up && down ) 
    			return null;
    		
    		else if(!left) {
    			if(up) {
    				return new Point(s.x-1,s.y);
    			}
    			if(right) {
    				return new Point(s.x,s.y+1);
    			}
    			if(down) {
    				return new Point(s.x+1,s.y);
    			}
    		}
    		else if(!right) {
    			if(down) {
    				return new Point(s.x+1,s.y);
    			}
    			if(left) {
    				return new Point(s.x,s.y-1);
    			}
    			if(up) {
    				return new Point(s.x-1,s.y);
    			}
    		}
    		else if(!up) {
    			if(right) {
    				return new Point(s.x,s.y+1);
    			}
    			if(down) {
    				return new Point(s.x+1,s.y);
    			}
    			if(left) {
    				return new Point(s.x,s.y-1);
    			}
    		}
    		else if(!down) {
    			if(left) {
    				return new Point(s.x,s.y-1);
    			}
    			if(up) {
    				return new Point(s.x-1,s.y);
    			}
    			if(right) {
    				return new Point(s.x,s.y+1);
    			}
    		}
    		
    		return null;
    		
    	}
    	
    	class Point {
    		
    		Point(int x,int y ) {
    			this.x = x;
    			this.y = y;
    		}
    		
    		int x ;
    		int y ;
    	}
    	
    }
    

      


      

  • 相关阅读:
    Exadata存储节点的CPU限制成功了没?
    如何减少Exadata计算节点CPU的Core数量
    如何选择适合你的HTAP数据库?
    小知识:Oracle中的层次查询
    小知识:使用MOS下载Oracle介质快速参考
    小知识:Flex ASM特性对集群资源显示的影响
    javaWeb request请求乱码、response响应中文乱码一站式解决方案
    java 文件File与byte[]数组相互转换的两种方式
    pr 如何调高导出视频的清晰度?
    pr 剪辑视频之剃刀用法
  • 原文地址:https://www.cnblogs.com/treemanfm/p/2976440.html
Copyright © 2011-2022 走看看