论坛首页 招聘求职论坛

深圳一家公司面试问题,很囧

浏览 78566 次
精华帖 (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;

}
1 请登录后投票
   发表时间:2010-10-31  
回旋数列,楼主可以搜索下相关算法很多了,不过面试出这题目,确实有点囧
0 请登录后投票
   发表时间: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();
		}
	}

}


0 请登录后投票
   发表时间: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;
}
0 请登录后投票
   发表时间:2010-12-06  
ACM的题目
0 请登录后投票
   发表时间:2010-12-06  
先按规律存在数组里,然后打出来
0 请登录后投票
   发表时间:2010-12-06  
想起来了,规律是碰到一行或一列结束就转弯。
0 请登录后投票
   发表时间: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()
   
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics