力扣刷题

Posted chenych

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣刷题相关的知识,希望对你有一定的参考价值。

两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

def run(nums,target):
    '''
    解题思路:
    假定target是由nums列表内的两个元素 i2和i3 之和。先循环nums列表得到i2的值,再循环从当前i2位置往后的列表的元素是否有和i2相加为target的i3值
    有则返回这两个元素i2和i3在nums列表的索引值。
    '''
    for i2 in nums:
        for i3 in nums[nums.index(i2)+1:]:
            if i2 + i3 == target :
                return nums.index(i2),nums[nums.index(i2)+1:].index(i3)+len(nums[:nums.index(i2)+1])
res = run([2,7,11,15],9)
print(res)
(0, 1)

整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [?231, 231 ? 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

def reverse(x):
    
    x = str(x)
    lis1 = [ i for i in x ]
    lis3 = []
    <h2>判断x为负数的情况</h2>
    if lis1[0] == '-':
        lis2 = [i for i in lis1[1:]]
        lis2.reverse()
        <h2>反转之后,判断首个元素为0的情况</h2>
        for j in range(len(lis2)):
            if not lis2[0]:
                lis2.pop(0)
        lis1 = ['-']+lis2
    <h2>判断x为0的情况</h2>
    elif not int(x):
        lis1=['0']
    else:
        lis1.reverse()
        <h2>反转之后,判断首个元素为0的情况</h2>
        for j in range(len(lis1)):
            if not int(lis1[0]):
                lis1.pop(0)

    x = ''.join(lis1)
    x = int(x)
    if x > 2 ** 31 - 1 or x < (-2) ** 31 or x == 0:
        x = 0
    return x
res = reverse(0)
print(res)
0
res = reverse(123)
print(res)
321
res = reverse(-123)
print(res)
-321
res = reverse(120)
print(res)
21

回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false

解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false

解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:

你能不将整数转为字符串来解决这个问题吗?

def isPalindrome(self, x: int) -> bool:
    if x<0 or x%10==0 and x !=0:<h2>当x 不等于0时,x小于0,或者是10的倍数,都返回false</h2>
        return False
    if x ==0:<h2>当x=0时,返回True</h2>
        return True
    x = str(x)
    nums=0 #用于记录索引
    a = [i for i in x]  
    if len(a)%2==0:<h2>如果整数的长度为偶数</h2>
        nums = int(len(a)/2) <h2>获取中间值得索引</h2>
        b = [j for j in a[nums:]]<h2>获取后一半的列表切片,进行翻转</h2>
        b.reverse()
        if a[:nums] == b:return True<h2>翻转后,与前一半进行比较,相等则返回True</h2>
        else:return False#否则返回false
    else:<h2>如果整数的长度为奇数</h2>
        nums = int((len(a)-1)/2)#获取中间值得索引
        b = [x for x in a[nums+1:]]<h2>获取后一半的列表切片,进行翻转</h2>
        b.reverse()
        if a[:nums] == b:return True
        else:return False

移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

你不需要考虑数组中超出新长度后面的元素。

示例 2:

给定 nums = [0,1,2,2,3,0,4,2], val = 2,

函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

注意这五个元素可为任意顺序。

你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝

int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。

// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

for (int i = 0; i < len; i++) {

print(nums[i]);

}

def removeElement(self, nums, val) -> int:
    a = 0
    for i in nums:#循环列表
        if val - i ==0:<h2>判断列表中 是否有元素等于val的值</h2>
            a = nums.count(i)<h2>计算出与val值相等的元素的个数</h2>
            for j in range(a):#从列表中循环删除这些元素
                nums.remove(i)
    return len(nums)

实现strStr()

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2

示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

def strStr(self, haystack: str, needle: str) -> int:
    num = 0 #初始值
    if needle=='':return num #如果needle是空字符串,返回0
    if needle in haystack: #haystack字符串包含needle中的字符串,如示例1
        num = haystack.index(needle)#检索needle中字符串在haystack中的索引
        return num#返回索引
    else:return -1<h2>如果needle不在haystack内,如示例2</h2>

最后一个单词的长度

给定一个仅包含大小写字母和空格 ‘ ‘ 的字符串,返回其最后一个单词的长度。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指由字母组成,但不包含任何空格的字符串。

示例:

输入: "Hello World"
输出: 5

class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        if s in ['',' ']:return 0#如果不存在最后一个单词,请返回 0 
        s = s.strip()
        lis = s.split(' ')
        if len(lis) ==1: return len(lis[0])
        else:
            return len(lis[-1])
        

加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]

解释: 输入数组表示数字 123。

示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]

解释: 输入数组表示数字 4321。

class Solution:
    def plusOne(self, digits):
        if digits[-1]!=9:#最低位数字加一位不超过9,不进位
            digits[-1] = digits[-1]+1 #返回最低位加1后的值
            return digits
        else: #最低位数字加一位超过9,向前进一位
            if digits.count(9)==len(digits):#如果每一个数字都是9,
                digits.insert(0,1)#在首位插入1
                for i in range(len(digits)):#循环,将所有的9替换成0
                    for j in digits:
                        if j ==9:
                            digits[digits.index(9)]=0
                return digits
            else:#连续个别是9,如[1,2,9,9]
                digits.reverse()
                digits[0] = 0#第一位变为0
                digits[1] += 1#后一位+1
                for i in range(1, len(digits)): <h2>再循环判断是否后一位+1后变为10,</h2>
                    if digits[i] ==10 :
                        digits[i] = 0
                        digits[i + 1] += 1
                digits.reverse()
                return digits
                
                    

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

class Solution:
    def singleNumber(self, nums):
        <h2>for i in nums:</h2>
        <h2>    for j in nums[nums.index(i)+1:]:</h2>
        <h2>        if i^j == 0:</h2>
        <h2>            nums.remove(j)</h2>
        <h2>            nums.remove(j)</h2>
        <h2>return nums[0]</h2>
    
        a = sum(nums)
        nums = set(nums)
        b = sum(nums)*2
        return b-a
    

查找重复的电子邮箱

编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。

示例:

+----+---------+
| Id | Email |
+----+---------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+----+---------+

根据以上输入,你的查询应返回以下结果:

+---------+
| Email |
+---------+
| [email protected] |
+---------+
说明:所有电子邮箱都是小写字母。

Write your mysql query statement below

select distinct a.Email from Person a, Person b where a.Email = b.Email and a.Id != b.Id

反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

class Solution:
    def reverseString(self, s):
        """
        Do not return anything, modify s in-place instead.
        """
        <h2>解题思路:在列表后面增加倒序排列的字符,再将原本字符删除</h2>
        a = len(s)
        for i in range(a):
            s.append(s[a-1-i])
        for i in range(len(s)-a):
            s.pop(0)

两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]

说明:

输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

class Solution:
    def intersection(self, nums1, nums2):
        '''
        思路:
        首先判断如果两个数组存在空数组的情况
        再将其中一个数组的元素循环与另一个数组比较,另一个数组也存在此元素的情况下 添加到设定的空集合中,最后返回列表
        '''
        if nums1==[] or nums2==[]:return [] 
        lis = set()
        for i in nums1:
            if i in nums2:
                lis.add(i)
        return list(lis)
            

两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。

我们可以不考虑输出结果的顺序。

进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?

如果 nums1 的大小比 nums2 小很多,哪种方法更优?

如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

class Solution:
    def intersect(self, nums1, nums2):
        '''
        思路:
        首先判断如果两个数组存在空数组的情况
        循环nums1中的元素,如果nums2中也有,则将此元素和它出现的最小次数添加到集合set1中,再对集合进行循环,转化成列表输出
        '''
        if nums1 == [] or nums2 == []: return []
        lis = []
        set1 = set()
        for i in nums1:
            if i in nums2:
                set1.add((i, min(nums1.count(i), nums2.count(i))))
        <h2>print(set1)</h2>
        for i in set1:
            for j in range(i[1]):
                lis.append(i[0])
        <h2>print(lis)  </h2>
        return lis
            

字符串中的单词数

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

示例:

输入: "Hello, my name is John"
输出: 5

class Solution:
    def countSegments(self, s: str) -> int:
        l=len(s.split(' ')) #字符串以空格分隔后,计算得到的列表长度
        #l在上面赋值之后,在下面有计算,有变化。所以这里用了len(s.plit(' '))
        for i in range(len(s.split(' '))): 
            if len(s.split(' ')[i])==0:l-=1#如果列表中元素存在空字符串,则长度减去1
        return l  

宝石与石头

给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。

示例 1:

输入: J = "aA", S = "aAAbbbb"
输出: 3

示例 2:

输入: J = "z", S = "ZZ"
输出: 0

注意:

S 和 J 最多含有50个字母。
J 中的字符不重复。

class Solution:
    def numJewelsInStones(self, J: str, S: str) -> int:
        lis = []
        for i in J:
            lis.append(i)
        <h2>print(lis)</h2>
        lis1 = []
        for i in S:
            lis阿1.append(i)
        <h2>print(lis1)</h2>
        num = 0
        for i in range(len(J)):
            num += S.count(J[i])
        return num
        

以上是关于力扣刷题的主要内容,如果未能解决你的问题,请参考以下文章

力扣刷题详解(含代码动态展示)

力扣刷题每日打卡

力扣刷题记录

力扣刷题每日打卡

力扣刷题每日打卡

火爆Github的刷题攻略,现在配套网站上线了!!力扣刷题网站,刷题路线