Leetcode题解 0019期

匿名 (未验证) 提交于 2019-12-03 00:30:01

我要调作息!

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

示例:

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

题目相对严谨

无需注意太多

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


题目:
给定一个单词数组和一个长度 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

这题还是相对简单。


题目:
实现 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

题目:
假设你正在爬楼梯。需要 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代码了。

转载请标明出处:Leetcode题解 0019期
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!