题目:https://leetcode-cn.com/problems/number-of-lines-to-write-string/
我们要把给定的字符串 S 从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行。我们给定了一个数组 widths ,这个数组 widths[0] 代表 'a' 需要的单位, widths[1] 代表 'b' 需要的单位,..., widths[25] 代表 'z' 需要的单位。
现在回答两个问题:至少多少行能放下S
,以及最后一行使用的宽度是多少个单位
?将你的答案作为长度为2的整数列表返回。
示例 1:
输入:
widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "abcdefghijklmnopqrstuvwxyz"
输出: [3, 60]
解释:
所有的字符拥有相同的占用单位10。所以书写所有的26个字母,
我们需要2个整行和占用60个单位的一行。
示例 2:
输入:
widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "bbbcccdddaaa"
输出: [2, 4]
解释:
除去字母'a'所有的字符都是相同的单位10,并且字符串 "bbbcccdddaa" 将会覆盖 9 * 10 + 2 * 4 = 98 个单位.
最后一个字母 'a' 将会被写到第二行,因为第一行只剩下2个单位了。
所以,这个答案是2行,第二行有4个单位宽度。
widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "bbbcccdddaaa"
index_s=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
num=len(S)
# 标记行数
line =1
# 标记最后一行使用的宽度是多少个单位
lens=0
# 循环S每个元素
for i in range(0,num):
# 循环26个字母数组,于S进行判断,相等,累计对应下标的需要的单位
for x,j in enumerate(index_s):
if j==S[i]:
# print(x,j,widths[x])
lens+=widths[x]
# 判断,大于100,那这个单位就是下一行的开始单位长度,反之,继续累加
if lens > 100:
line +=1
lens = widths[x]
return[line,lens]
官方解答
lines, width = 1, 0
for c in S:
w = widths[ord(c) - ord('a')]
width += w
if width > 100:
lines += 1
width = w
return lines, width
还可以运用字典
#把26字母和对应0-25组成字典
char_index = dict(zip("abcdefghijklmnopqrstuvwxyz", range(26)))
print(char_index)
# {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9, 'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14, 'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19, 'u': 20, 'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}
#直接把26字母和widths 对应的单位组成字典
widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
map_dic = dict(zip('abcdefghijklmnopqrstuvwxyz',widths ))
print(map_dic)
temp_dict={f"{chr(i+97)}":widths[i] for i ,v in enumerate(widths)}
print(temp_dict)
# {'a': 4, 'b': 10, 'c': 10, 'd': 10, 'e': 10, 'f': 10, 'g': 10, 'h': 10, 'i': 10, 'j': 10, 'k': 10, 'l': 10, 'm': 10, 'n': 10, 'o': 10, 'p': 10, 'q': 10, 'r': 10, 's': 10, 't': 10, 'u': 10, 'v': 10, 'w': 10, 'x': 10, 'y': 10, 'z': 10}
学到了几个Python 内置函数
ord() 函数
- ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数
- 它以一个字符(长度为1的字符串)作为参数,
返回对应的 ASCII 数值,或者 Unicode 数值
- 如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
- 语法:
ord(c)
, c --字符
。 - 返回值:
对应的十进制整数
。
ord('a')=97
ord('b')=98
ord('c')=99
#26个字母,a对应97,z对应97+26,其他一一对应
chr() 函数
- chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
- 语法:
chr(i)
,i -- 可以是10进制
也可以是16进制
的形式的数字
。 - 返回值:
当前整数对应的 ASCII 字符
。
print chr(0x30), chr(0x31), chr(0x61) # 十六进制
0 1 a
print chr(48), chr(49), chr(97) # 十进制
0 1 a
unichr() 函数
- unichr() 函数 和 chr() 函数功能基本一样, 只不过是返回 unicode 的字符。
- 注意: Python3 不支持 unichr(),改用 chr()
- 语法:unichr(i), i -- 可以是10进制也可以是16进制的形式的数字。
- 返回值:unicode 的字符。
unichr(97) u'a'
unichr(98) u'b'
unichr(99) u'c'
网友评论