美文网首页
1.写字符串需要的行数(2020-09-18)

1.写字符串需要的行数(2020-09-18)

作者: 小飞船1号 | 来源:发表于2020-09-21 11:10 被阅读0次

    题目: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'
    

    相关文章

      网友评论

          本文标题:1.写字符串需要的行数(2020-09-18)

          本文链接:https://www.haomeiwen.com/subject/pbijyktx.html