leetcode每日一题【7】

文章介绍了三个编程问题的解决方案:一是实现两个二进制字符串的加法;二是给出一个排序数组和目标值,寻找目标值的索引或插入位置,要求时间复杂度为O(logn),给出了循环和二分查找两种方法;三是判断一个整数是否为回文数。所有问题均提供了Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

第一题: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" ,就不含前导零

解题思路

咱就是说,这个题目的笨蛋解法我绝对不会写出来第二次一模一样的,大体思路如下:

  1. 先比较两个二进制数的位数是否相同,如果不同则将短位数的数进行使用缺失位数的0进行补全;
  2. 设置一个布尔值标签表示是否有进位;
  3. 从每一个二进制的低位进行循环的加法,分为三种大的情况:
  • 第一种是两个对应位都是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. 如果不存在,则进行逐位迭代,当被插入元素大于当前值且不到最后一个值时,一直向后走;当被插入元素大于当前值且到达最后一个值时,则返回最大索引值+1的结果;反之找到当被插入元素小于当前值时则找到了该插入的索引位置。

解题思路2)——二分查找

采用二分查找(折半查找)的方式进行位置查找的时间复杂度是符合题目 O(log n)的要求的~

大体思路如下:

  1. 定义一个左右指针分别指向第一个元素和末尾元素
  2. 写一个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

解题思路

  1. 定义首尾指针,分别向中间进行逼近
  2. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值