第一题
:67. 二进制求和
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
提示:
1 <= a.length, b.length <= 10^4
a 和 b 仅由字符 '0' 或 '1' 组成
字符串如果不是 "0" ,就不含前导零
解题思路
:
咱就是说,这个题目的笨蛋解法我绝对不会写出来第二次一模一样的,大体思路如下:
- 先比较两个二进制数的位数是否相同,如果不同则将短位数的数进行使用缺失位数的0进行补全;
- 设置一个布尔值标签表示是否有进位;
- 从每一个二进制的低位进行循环的加法,分为三种大的情况:
- 第一种是两个对应位都是1,但没有进位,直接列表追加0,再将标签改为True
- 第二种是两个对应位都是1,但有进位,直接列表追加1,再将标签改为True
- 第三种情况又可以分为三种情况:
- 第一种情况是有进位且两位数分别为0和1,这个时候列表追加0,且将标签改为True
- 第二种情况是有进位且两位数都是0,这个时候列表追加1,且将标签改为False
- 最后一种情况没有进位两者直接相加即可(包含0和1,1和0,0和0)
最后将字符串列表反向拼接输出出来即可
代码
:
class Solution:
def addBinary(self, a: str, b: str) -> str:
c = []
diff = abs(len(a) - len(b))
if len(a) > len(b):
b = '0' * diff + b
else:
a = '0' * diff + a
jinwei = False
for i in range(len(a) - 1, -1, -1):
if a[i] == '1' and b[i] == '1' and not jinwei:
c.append(0)
jinwei = True
elif a[i] == '1' and b[i] == '1' and jinwei:
c.append(1)
jinwei = True
else:
if jinwei and \
((a[i] == '1' and b[i] == '0') or (a[i] == '0' and b[i] == '1')):
c.append(0)
jinwei = True
elif jinwei and a[i] == '0' and b[i] == '0':
c.append(int(a[i]) + int(b[i]) + 1)
jinwei = False
else:
c.append(int(a[i]) + int(b[i]))
if jinwei:
c.append(1)
return ''.join(map(str, c[::-1]))
第二题
:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
提示:
1 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
nums 为 无重复元素 的 升序 排列数组
-10^4 <= target <= 10^4
解题思路1——普通循环
:
这个方法在leetcode也不会超时,可能里面的测试样例需要全部循环一遍的不多吧~
大体思路如下,分为两种情况:
- 如果被插入元素在被插入列表中存在,直接将存在元素的索引返回;
- 如果不存在,则进行逐位迭代,当被插入元素大于当前值且不到最后一个值时,一直向后走;当被插入元素大于当前值且到达最后一个值时,则返回最大索引值+1的结果;反之找到当被插入元素小于当前值时则找到了该插入的索引位置。
解题思路2)——二分查找
:
采用二分查找(折半查找)的方式进行位置查找的时间复杂度是符合题目 O(log n)的要求的~
大体思路如下:
- 定义一个左右指针分别指向第一个元素和末尾元素
- 写一个while循环,条件为当左指针索引<=右指针索引时进行循环,每次循环重新计算中间值mid,比较mid与target值的大小来更新左指针或者右指针的大小,mid与target值相等时即为上个解题思路中被插入元素在列表存在的情况;不存在即返回迭代结束后的左指针即为正确答案~
代码
:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
if target in nums:
return nums.index(target)
else:
for i, e in enumerate(nums):
if e < target and e != nums[-1]:
continue
elif e < target and e == nums[-1]:
return i+1
else:
return i
# 二分查找的思路,返回左指针即为答案
# class Solution:
# def searchInsert(self, nums: List[int], target: int) -> int:
# left, right = 0, len(nums) - 1
# while left <= right:
# mid = left + (right - left) // 2
# if nums[mid] == target:
# return mid
# elif nums[mid] < target:
# left = mid + 1
# else:
# right = mid - 1
# return left
第三题
:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-2^31 <= x <= 2^31 - 1
解题思路
:
- 定义首尾指针,分别向中间进行逼近
- while的条件为left的索引小于等于right,每一轮循环left和right指向的值是否相等,有一次不同即返回False,结束程序;如果奇数个字符,最后一步left=right的时候即全部字符比较完毕,那么这个数即为回文数~
代码
:
class Solution:
def isPalindrome(self, x: int) -> bool:
str_x = str(x)
left = 0
right = len(str_x) - 1
while left <= right:
if str_x[left] == str_x[right]:
left += 1
right -= 1
else:
return False
sys.exit()
return True