锁定老帖子 主题:深圳一家公司面试问题,很囧
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-10-31
最后修改:2010-10-31
发一个c的代码
#include <stdio.h> #include <stdlib.h> const int step[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; int main() { int i = 0; int n = 6; int x = 0, y = 0; int dir = 0; int* map; map = (int*)malloc(n*n*sizeof(int)); memset(map, 0, n*n*sizeof(int)); for ( i = 0; i < n * n; i++ ) { map[x*n+y] = i + 1; x += step[dir][0]; y += step[dir][1]; if ( !(0<=x && x<n && 0<=y && y<n && map[x*n+y] == 0 ) ) { x -= step[dir][0]; y -= step[dir][1]; dir = (dir + 1) % 4; x += step[dir][0]; y += step[dir][1]; } } for ( y = 0; y < n; y++ ) { for ( x = 0; x < n; x++ ) { printf("%4d ", map[x*n+y]); } printf("\n"); } free(map); return 0; } |
|
返回顶楼 | |
发表时间:2010-10-31
回旋数列,楼主可以搜索下相关算法很多了,不过面试出这题目,确实有点囧
|
|
返回顶楼 | |
发表时间:2010-12-06
来了JAVAEYE这么久,第一次贴代码,虽然只是很一般的题目,但是感觉不错,起码迈出了第一步。
package test2; public class PrintNums { /** * @param args * auth 孟卫峰 * date Dec 6, 2010 */ public static void main(String[] args) { int [][] nums= getNums(10); showNums( nums); } private static int[][] getNums(int n) { int[][] nums=new int[n][n]; int maxX=n-1; int minX=1; int maxY=n-1; int minY=0; boolean flag=true;//true表示Y移动 false表示X移动 int forward=1;//true表示增加 false表示减少 int k=1;//用来判断是否改变forward的值,方向改变两次就改变forward的值 int x=0,y=0; for(int i=1;i<=n*n;i++){ if(k%3==0){ forward=-1*forward; k=1; } nums[x][y]=i; if(flag){ y=y+forward; if(forward>0&&y==maxY){ flag=false; k++; maxY--; } if(forward<0&&y==minY){ flag=false; k++; minY++; } }else{ x=x+forward; if(forward>0&&x==maxX){ flag=true; maxX--; k++; } if(forward<0&&x==minX){ flag=true; minX++; k++; } } } return nums; } private static void showNums( int[][] nums) { for(int i=0;i<nums.length;i++){ for(int j=0;j<nums[0].length;j++){ System.out.print(nums[i][j]+"\t"); } System.out.println(); } } } |
|
返回顶楼 | |
发表时间:2010-12-06
/**
* 生成一个i*i的方阵 * @param i * @return */ public int[][] generatePhalanx(int i) { int[][] a = new int[i][i]; a[0][0] = 1; int col = 0;/**记录方阵列号*/ int row = 0;/**记录方阵行号*/ int n = 0; int count = i % 2 == 0 ? i / 2 : i / 2 + 1; /** 执行的次数,执行完一圈为一次 */ for (int time = 1; time <= count; time++) { /***/ for (col = time - 1, n = 0; n < i + 2 - 2 * time; col++, n++) { if (col == 0) a[time - 1][col] = 1; else a[time - 1][col] = a[time - 1][col - 1] + 1; } /***/ for (row = time; row < i - time + 1; row++) { a[row][col - 1] = a[row - 1][col - 1] + 1; } /***/ for (col = row - 1; col > time - 1; col--) { a[row - 1][col - 1] = a[row - 1][col] + 1; } /***/ for (row = i - time; row > time; row--) { a[row - 1][col] = a[row][col] + 1; } } return a; } |
|
返回顶楼 | |
发表时间:2010-12-06
ACM的题目
|
|
返回顶楼 | |
发表时间:2010-12-06
先按规律存在数组里,然后打出来
|
|
返回顶楼 | |
发表时间:2010-12-06
想起来了,规律是碰到一行或一列结束就转弯。
|
|
返回顶楼 | |
发表时间:2010-12-08
def cir():
size = 5 panel = [[0 for r in range(size)]for col in range(size)] direct = 0;xx = 0;yy = 0;v0 = 1 rg = [0, 0, size, size] dx = [1, 0, -1, 0] dy = [0, 1, 0, -1] dd = [1, 1, -1, -1] while v0 <= size * size: panel[yy][xx] = v0 v0 += 1 if not (xx + dx[direct] >= rg[0] and xx + dx[direct] < rg[2] and yy + dy[direct] >= rg[1] and yy + dy[direct] < rg[3]): direct = (direct + 1) % 4; rg[direct] += dd[direct] xx += dx[direct] yy += dy[direct] for p in panel: print(p) if __name__ == '__main__': cir() |
|
返回顶楼 | |