Python3学习(28)--利用二维数组解决平面图形M的打印
来源:互联网 发布:泰语自学软件 编辑:程序博客网 时间:2024/05/29 09:09
这是一道面试题,题目就是 打印图形 ,图形类似于:
M
用数字填充后,效果如下:
注意,对称关系也要求的话,还要判断数字的长度,比如,数字超过9的话,后面的数字打印空格的时候,就要打印两遍(两位数),如果数字超过99的话,逢空格就要打印三遍(三位数),依次类推。
遇见这种数字图形打印题的时候,一般不要慌,又不是3D的图形,只要是平面的图,我们都转化为二维数组的思想去存下平面图形中的每个点(数据),比如常见的五子棋的棋盘,就是一个典型的二维数组,每个棋子都是一个(x,y)坐标,对应一个二维数组里面的数据(arr[x][y]),因此,我们在excel表格中,绘制一个简单的M平面图,并简单查找规律总结如下:
规律总结:
(1)横向(X)的坐标,始终都是在递增,横向表示平面图形的列
(2)纵向(Y)的坐标,有两个状态,递增和递减,因此,我们需要一个状态控制判断是递增还是递减
(3)我们发现,行和列的关系存在: row = (col/4) + 1
(4)我们还要思考,数字的占位问题(对称),也就是每一行每一列,那些没有填充数字的部分,究竟要打印多少了数字占位符(空格),其实,这个很容易分析,一位数,占一个空格,两位数,占两个空格,三位数,占三个空格,依次类推下去.........
根据以上规律,我们直接上demo:
M.py:
#!/usr/bin/env Python3# -*- encoding:UTF-8 -*-#导入 print_function 功能 使打印支持 不换行from __future__ import print_function''' 3 7 2 4 6 8 -->任何这种打印的面试题,都化解为二维数组 找规律,解决 1 5 9'''def PrintM(col): row = col//4 + 1;#行 根据规律,找到row 和 col 的 关系式 x = 0 #x坐标 横向 代表 列 y = row -1 #y坐标 竖向 代表 行 1 最开始的行索引 为 row -1 oper = False #判断y是否 ++ 还是 -- 一上来 先-- #arrM = [[0]*col]*row 这种二维数组的定义,涉及浅拷贝,不适合本篇 arrM = [([0]*col) for i in range(row)] #采用生成式 创建一个二位数组 #填充数字 注意,不符合条件的,将被填充0 for i in range(1,col+1): arrM[y][x] = i if not oper: y = y - 1 if oper: y = y + 1 if y < 0:#证明此时 y = -1 由于碰到头0出去了(减过头了),所以需要拉回来2格,同时进行y++操作 y = y + 2 oper = True #操作置为true 表示y++(减过头了,肯定要++) if y > row -1: #证明此时 y = row 由于碰到头row-1出去了(加过头了),所以需要拉回来2格,同时进行y--操作 y = y - 2 oper = False #//操作置为false 表示y--(加过头了,肯定要--) x = x +1 #end for 循环 #打印二维数组的值 即平面图形 M 双重for 循环 for i in range(row): for j in range(col): cycle = 1 #循环打印空格的次数 默认1次(个位数) ''' 列索引从0开始,因此,索引9放的是10, 以后每一个都要占两位 因此,索引99放的是100,以后每一个都要占三位 ............................占四位 9后面两个空格,99后面三个空格,999后面四个空格,依次类推 ''' if j>=9: cycle = 2 if j>=99: cycle = 3 if j>=999: cycle = 4 #这个打印几个空格的规律暂时没有想到更好的表达式代替,暂且多if判断 if arrM[i][j] == 0: while cycle>0: print(' ',end = '') cycle = cycle -1 else: #如果不是0,原封不动的打印数值,此时数值前面已经有了空格填充 print(arrM[i][j],end = '') print() #每一组结束后,记得换行 PrintM(110)
demo中我们测试110个数的平面图展示,最后的结果,非常壮观,截取后半部分效果图如下:
关于打印空格的算法可以优化,有兴趣的可以尝试一下。
关于算法---------------> 思路很重要!
没事,多画画,多写写,找找规律,如果程序解决不了(一时半会写不了代码),那我们就把实现的伪代码写出来,走一遍整个流程,然后,再慢慢去修改我们的伪代码,一步步实现我们想要的结果,本篇就是这样的思路,一步步完善最终的Demo,没有绝对的天才,一上来就能一气呵成,我们恰恰需要的是沉淀,积累学习的经验,这才是学习的精髓所在!
Python写起代码很舒服
|
|
V
Java版本的地址----> Java 平面图形M打印
- Python3学习(28)--利用二维数组解决平面图形M的打印
- C语言函数编程:二维数组打印平面图形-->死
- 平面图形(二维数组)
- 打印平面图形(M形)
- Java--平面图形M打印(通用版)
- 使用二维数组打印M
- 利用Turbo C进行平面二维图形的平移,旋转,缩放,对称
- 二维数组的打印
- 二维数组的打印
- 打印平面图形
- 特殊的二维图形的绘制.m
- 利用二维数组打印倒立等腰三角形
- 利用二维数组打印杨辉三角
- 介绍MATLAB 的基本绘图功能:二维平面图形
- 打印二维数组的新方法
- 二维数组m*n的鞍点
- 二维数组m*n的鞍点
- 二维数组m*n的鞍点
- xslt若干问题记录
- 判断数组是否包含某个值
- CodeForces
- CSS之盒子模型的浮动
- Vue项目调用本地的json文件
- Python3学习(28)--利用二维数组解决平面图形M的打印
- 快速打开windows任务管理器
- Django中的Form表单
- IO流——练习3
- Android 注解助你理解AS和Butterknife
- spring配置redis
- Android音乐播放器——甩动切歌
- [经验]存id的方法
- 连接sqlserver需要注意的地方