Leetcode题解 0019期

我要调作息!

0067题 二进制求和【Add Binary】

题目:
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。

示例:

输入: a = "11", b = "1"
输出: "100"

输入: a = "1010", b = "1011"
输出: "10101"

题目相对严谨

无需注意太多

解题思路:
这题就是进位而已,python3可以尝试使用eval函数来解决,2333,如此简单,不post代码。
或者可以使用python3中int函数可以传入的另一个参数base,直接转化。另外python3的binocthex这些函数的返回值都属于str类型,所以可以直接slicing。


0068题 文本左右对齐【Text Justification】

题目:
给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格' ' 填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。

文本的最后一行应为左对齐,且单词之间不插入额外的空格。

说明:

  • 单词是指由非空格字符组成的字符序列。
  • 每个单词的长度大于 0,小于等于 maxWidth。
  • 输入单词数组 words 至少包含一个单词。

示例:

输入:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
输出:
[
   "This    is    an",
   "example  of text",
   "justification.  "
]


输入:
words = ["What","must","be","acknowledgment","shall","be"]
maxWidth = 16
输出:
[
  "What   must   be",
  "acknowledgment  ",
  "shall be        "
]
解释: 注意最后一行的格式应为 "shall be    " 而不是 "shall     be",
     因为最后一行应为左对齐,而不是左右两端对齐。       
     第二行同样为左对齐,这是因为这行只包含一个单词。

输入:
words = ["Science","is","what","we","understand","well","enough","to","explain",
         "to","a","computer.","Art","is","everything","else","we","do"]
maxWidth = 20
输出:
[
  "Science  is  what we",
  "understand      well",
  "enough to explain to",
  "a  computer.  Art is",
  "everything  else  we",
  "do                  "
]

题目相对严谨

需要注意:
1. 空格的分配
2. 理解什么叫做尽可能均匀,不知道空格有没有这种情况:3\3\3\1\1 or 3\2\2\2\2,我是按照后者来编的,然后AC了,所以我们最终也不知道……
3. Robust

解题思路:
几个简单题中突然冒出来一个困难题目,题目叙述如此之多。每次遇到字符串的题目就很麻烦的,其实说字符串的处理还有链表题可以是编程中几个最不想碰的东西,这些真的可以说是计算机科学所独有的,其他题你可以说或多或少都有一些数学的影子,但一旦涉及到这两个,数学知识的丰富程度就帮不上忙了,而是逻辑性,这里post代码。

class Solution:
    def fullJustify(self, words, maxWidth):
        res = []
        tmp_wordList = [words[0]]
        cnt_len = len(words[0])

        for word in words[1:]:
            if cnt_len + len(word) + 1 <= maxWidth:
                tmp_wordList.append(word)
                cnt_len += len(word) + 1
            else:
                tot = len("".join(tmp_wordList))
                n = len(tmp_wordList)
                space_need = maxWidth - tot
                if n == 1:
                    tmp = tmp_wordList[0] + ' '*space_need
                    res.append(tmp)
                    tmp_wordList = [word]
                    cnt_len = len(word)
                    continue
                if space_need % (n-1) == 0:
                    space_num = space_need // (n-1)
                    tmp = (" "*space_num).join(tmp_wordList)
                    res.append(tmp)
                    tmp_wordList = [word]
                    cnt_len = len(word)
                else:
                    space_num = space_need // (n-1)
                    space_left = space_need - space_num*(n-1)
                    tmp = (" "*(space_num+1)).join(tmp_wordList[:space_left+1]) + " "*space_num + (" "*space_num).join(tmp_wordList[space_left+1:])
                    res.append(tmp)
                    tmp_wordList = [word]
                    cnt_len = len(word)

        if cnt_len > 0:
            tmp = " ".join(tmp_wordList)
            tot = len(tmp)
            space_need = maxWidth - tot
            tmp += " "*space_need
            res.append(tmp)

        return res

这题还是相对简单。


0069题 x的平方根【Sqrt(x)】

题目:
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例:

输入: 4
输出: 2

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数,小数部分将被舍去。

题目不严谨之处:
1. 没有定义输入数据范围

无需注意太多

解题思路:
这题应该是考的手动开方吧……但是标的是简单……额,然后看了眼标签,二分查找,明白了。但是这我直接做sqrt()会不会更快呢……这题不post代码了,太简单。快速降幂也行,这里post python3在Leetcode上的最快解法

class Solution:
    def mySqrt(self, x):
        r = x
        while r * r > x:
            r = (r + x // r) // 2
        return r

0070题 爬楼梯【Climbing Stairs】

题目:
假设你正在爬楼梯。需要 n 步你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

示例:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 步 + 1 步
2.  2 步

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 步 + 1 步 + 1 步
2.  1 步 + 2 步
3.  2 步 + 1 步

经典题目相对严谨

经典题目除Robust以外无需注意太多

解题思路:
这种题用回溯效率就肯定非常低了,这种题可以说才是标准的数字动态规划?列出到达每层楼梯的方法就行了d[i] = d[i-1] + d[i-2]
就不post代码了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值