博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【程序员面试宝典】找规律
阅读量:7127 次
发布时间:2019-06-28

本文共 2271 字,大约阅读时间需要 7 分钟。

都不是难题,但是我的脑子木木的,条件写的很混乱。

 

1.

数字如上,1对应坐标(0,0),向上y变小,向右x变大。给定坐标,输出值。

观察发现:

第n圈结束时,一共输出了(2n)2个数字。这样,我们判断当前在第几圈,并找到位置对应当前的第几个数字就可以得到结果。

int getNum(int x, int y){    int dx, dy, n, count;    dx = (x <= 0) ? -x : x - 1;    dy = (y <= 0) ? -y : y - 1;    n = (dx > dy) ? dx : dy; //前面已经有完整的n圈    //第n圈(从1开始)     //第一个数字的位置是 -(n-1), n-1    //第一个拐角的位置是 -(n-1), -(n-1)    //第二个拐角的位置是 n, -(n-1)    //第三个拐角的位置是 n, n    int curn = n + 1; //当前的圈数    int d1 = 2 * (curn - 1) + 1; //第一个拐角前有几个数字(包括第一个拐角)    int d2 = 2 * (curn - 1); //第一和第二个拐角间有几个数字(不包括两个拐角)    int d3 = 2 * curn;  //第二和第三个拐角中间有几个数字(包括两个拐角)    if(n == dx)    {        if(x <= 0 && y <= curn - 1) //在第一个拐角前        {            count = (curn - 1) - y + 1;        }        else if(x > 0) //在第三个拐角前        {            count = y + (curn - 1) + 1 + d1 + d2;        }        else //最后一个数字 单独判断        {            count = 2 * curn * 2 * curn - 2 * n * 2 * n;        }    }    else    {        if(y <= 0) //在第二个拐角前        {            count = x + (curn - 1) + d1;        }        else //在第三个拐角之后        {            count = curn - x + d1 + d2 + d3;        }    }    int num = 2 * n * 2 * n + count;    return num;}

 

 

2.输入n, 输出n*n的之字形排列的数组,如下图:

思路:懒得找规律,直接按照数字的出现的情况来写代码。

数字的走向一共有4种情况:

向右:向下:向左下方:向右上方;

根据已有数字的大小和位置判断下一个数字应该出现在哪里。

void zigzag(int n){    int *a = new int[n * n];    memset(a, 0, n * n * sizeof(int));    int r = 0;    int c = 0;    for(int i = 0; i < n * n; i++)    {        a[r * n + c] = i;        if((c < n - 1) && (((r == 0 || r == n - 1) && (c > 0 && a[r * n + c - 1] != i - 1)) || (c == 0 && (r == 0 || r == n - 1 && a[(r - 1) * n + c] != i - 1 )))) //向右走        {            c = c + 1;        }        else if(((c == 0 || c == n - 1) && (r > 0 && a[(r - 1) * n + c] != i - 1)) || (r == 0 && c == n - 1 && a[r * n + c - 1] != i - 1)) //向下走        {            r = r + 1;        }        else if(r == 0 || a[(r - 1) * n + c + 1] == i - 1 || c == n - 1 && a[(r - 1) * n + c] == i - 1) //向左下方走        {            r = r + 1;            c = c - 1;        }        else //向右上方走        {            r = r - 1;            c = c + 1;        }    }    for(int i = 0; i < n; i++)    {        for(int j = 0; j < n; j++)        {            printf("%4d ", a[i * n + j]);        }        printf("\n");    }    delete [] a;}

 

转载地址:http://mvhel.baihongyu.com/

你可能感兴趣的文章
POJ 3252, Round Numbers
查看>>
荒野无灯路由器固件配置DDNS的过程
查看>>
Dotest-两张图告诉你,为什么要测试兼容性?
查看>>
HTML 5 History API的”前生今世”
查看>>
【iOS】iOS消息推送机制的实现
查看>>
电脑高手常用快捷键
查看>>
杨辉三角形
查看>>
css3 flex笔记整理
查看>>
swift 分组tableview 设置分区投或者尾部,隐藏默认间隔高度
查看>>
MySQL案例09:Last_IO_Error: Got fatal error 1236 from master when reading data from binary log
查看>>
js 图片压缩 转成base64
查看>>
文艺小青年
查看>>
[转]制作Chrome扩展
查看>>
Tcpdump抓包
查看>>
正则表达式抓取网页中的邮箱地址
查看>>
关于在主进程返回;线程陷入死循环
查看>>
Java必须了解的“递归”与“IO流”!!!
查看>>
Http协议状态码
查看>>
css3单冒号和双冒号的区别
查看>>
小X与缩写
查看>>