我要调作息!
0067题 二进制求和【Add Binary】
题目:
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例:
输入: a = "11", b = "1"
输出: "100"
输入: a = "1010", b = "1011"
输出: "10101"
题目相对严谨
无需注意太多
解题思路:
这题就是进位而已,python3可以尝试使用eval函数来解决,2333,如此简单,不post代码。
或者可以使用python3中int函数可以传入的另一个参数base,直接转化。另外python3的bin
、oct
、hex
这些函数的返回值都属于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代码了。