【每周一坑】罗马数字转换
罗马数字是欧洲在阿拉伯数字传入之前使用的一种数码,现在的使用已经非常少了,大概偶尔会在钟表、文章中的标号等地方还能见到。
罗马数字采用七个罗马字母作数字、即 I(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。它有一套不同于阿拉伯数字的写法规则,简单来说可以总结为:
相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
在一个数的上面画一条横线,表示这个数增值 1,000 倍。
那么今天,我们就来尝试写个罗马数字和阿拉伯数字的转换器吧:
给定一个小于 3999 的罗马数,将其转换为整数,例如:Ⅲ=3、Ⅳ=4、Ⅵ=6、XIX=19、XX=20、XLV=45、MCMLXXX=1980。
附加题:
给定一个小于 3999 整数,将其转换为罗马数。
示例:
def romanToInt(s): # your code here return i
assert romanToInt('III') == 3
assert romanToInt('IV') == 4
assert romanToInt('VI') == 6
assert romanToInt('XIX') == 19
assert romanToInt('XLV') == 45
assert romanToInt('MCMLXXX') == 1980
assert romanToInt('CMXCIX') == 999
期待各位同学提交解答。
提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。
往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。
【解答】螺旋矩阵
解题思路:
由图可知,螺旋数组中的数字运动方向依次 右 -> 下 -> 左 -> 上 -> 右 这样的循环,在合适的条件下变换累加方向即可。
变换方向的条件有两个,一是遇到数组边界,二是下一位置被其他数占据。
可用一个二维列表存储数据,按照规则将列表中填上数字,最后再输出。
示例代码:
class Spiral: def __init__(self, N): # 构造一个二维数组 self.matrix = [[None for i in range(N)] for j in range(N)]
# 起始行列数 self.row = 0 self.col = 0 # 数组的边界值 self.max_row = N
# 更换方向的标记 self.mark = 0 # 按需取出数组运动方向 def derection(self, mark): around = [ [self.row, self.col+1], # 向右 [self.row+1, self.col], # 向下 [self.row, self.col-1], # 向左 [self.row-1, self.col] # 向上 ]
return around[mark%4]
# 针对目前位置,获取下一位置的行列数 # 下一位置为边界则更换方向 # 下一位置已经有元素则更换方向 def next(self): # 下一位置 i = self.derection(mark=self.mark)
# 判断是否更换方向,不更换则更新 self.row / self.col if -1 not in i and self.max_row not in i:
if self.matrix[i[0]][i[1]] is None: self.row,self.col = i
return None # 更换方向 self.mark += 1 return self.next()
def solution(self): # 逐一取出 1 到 n^2 值 for i in range(1,self.max_row**2+1):
# 按行列赋值 self.matrix[self.row][self.col] = i
# 退出条件 if i == self.max_row**2:
break # 更新行列值 self.next()
# 打印结果 for r in self.matrix:
for c in r: print('{0:^{1}}'.format(c,self.max_row), end=' ') print('\n')
if __name__ == '__main__': n = int(input('>>>')) s = Spiral(n) s.solution()
@wuxiaojiao 同学的代提交答案中最简洁的
http://paste.ubuntu.com/24955910/
@徐大龙 同学的代码使用了 numpy 库
https://github.com/PeytonXu/learn-python/blob/master/cases/helix_matrix/helix_matrix.py