力扣python练习 | 1.基础实现部分【编程基础0-1】

1.交替合并字符串

给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。

返回 合并后的字符串 。

示例 1:

输入:word1 = "abc", word2 = "pqr"
输出:"apbqcr"
解释:字符串合并情况如下所示:
word1:  a   b   c
word2:    p   q   r
合并后:  a p b q c r
class Solution:
    def mergeAlternately(self, word1: str, word2: str) -> str:
        if len(word2)>len(word1):
            max=word2
            min=word1
        else:
            max=word1
            min=word2
        str=''
        for i in range(len(min)):
            str+=word1[i]+word2[i]
        str=str+max[len(min):]
        return str

2.找不同

给定两个字符串 s 和 t ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
#法一:排序后逐一比较
        
        s,t=sorted(s)+[' '],sorted(t)
        for i,j in zip(s,t):
            if i!=j:
                return j
        
#法二:计数相减
        return (Counter(t)-Counter(s)).popitem()[0]

'''
解释:
1.Counter(t) 会统计字符串 t 中每个字符出现的次数,返回一个类似字典的对象。
2.Counter(s) 同样会统计字符串 s 中每个字符出现的次数。
3.两个 Counter 对象相减后得到的结果是一个包含了不同字符及其出现次数的 Counter 对象。
4.使用 popitem() 方法可以随机弹出 Counter 对象中的一个键值对,然后通过 [0] 取出键,即为不同的字符。
5.Counter()为collection包中的函数
'''

3.找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        n=len(needle)
        m=len(haystack)
        lst=[]
        if n>m:
            return -1
        else:
            for i in range(m-n+1):
                if needle==haystack[i:i+n]:
                    return i
                else:
                    continue
            return -1

4.有效的字母异位词 

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:

#法一:使用Counter函数统计各个字符出现次数

        if Counter(s)==Counter(t):
            return True
        else:
            return False

#法二:自行编写和Counter函数功能一样的代码,用字典完成对s和t字符的统计,并比较
        
        dict1,dict2={},{}
        for i in s:
            if i not in dict1:
                dict1[i]=1
            else:
                dict1[i]+=1
        for j in t:
            if j not in dict2:
                dict2[j]=1
            else:
                dict2[j]+=1
        if dict1==dict2:
            return True
        else:
            return False

5.重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

输入: s = "aba"
输出: false
class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:

#解法:子串长度范围为1~字符串长度的一半
#   for循环依次添加一个字符序:①判断字符串长度摩子串长度后是否余数为0,不是则进入下一步循环
#        ②判断字符串s以子串为分隔单元分隔后,列表里是否都为空元素,是则返回True
        
        sub_s=''
        for i in range(len(s)//2):
            sub_s+=s[i]
            if len(s) % len(sub_s) != 0:
                continue
            else:
                if set(s.split(sub_s))=={''}:
                    return True
        return False

6.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
#解法:统计0元素的个数count,用for循环将列表remove个count次,最后在结尾填count个0

        count=Counter(nums)[0]
        for i in range(count):
            nums.remove(0)
        nums.extend([0 for i in range(count)])

7.加一

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

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

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

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:

#解法:将列表join变成数字+1后,将数字采用取余和整除的方法转换成新列表

        digits=[str(i) for i in digits]
        num=''.join(digits)
        num=int(num)+1
        lst=[]
        while num>0:
            lst.append(num%10)
            num=num//10
        return lst[::-1]

8. 数组元素积的符号

已知函数 signFunc(x) 将会根据 x 的正负返回特定值:

  • 如果 x 是正数,返回 1 。
  • 如果 x 是负数,返回 -1 。
  • 如果 x 是等于 0 ,返回 0 。

给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。

返回 signFunc(product) 。

示例 1:

输入:nums = [-1,-2,-3,-4,3,2,1]
输出:1
解释:数组中所有值的乘积是 144 ,且 signFunc(144) = 1
class Solution:
    def arraySign(self, nums: List[int]) -> int:
#解法:定义函数signFunc,遍历数组乘积,对其进行判断
        product=1
        def signFunc(x):
            if x>0:
                return 1
            elif x<0:
                return -1
            else:
                return 0
        for i in nums:
            product*=i
        return signFunc(product)

 9.判断能否形成等差数列

给你一个数字数组 arr 。

如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。

如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。

示例 1:

输入:arr = [3,5,1]
输出:true
解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。
class Solution:
    def canMakeArithmeticProgression(self, arr: List[int]) -> bool:

#解法:①排序后列表的前n-1个元素和后n-1个元素作差
#       ②判断差值是否都相同:将差值列表转化为集合去重,判断集合元素个数是否为1
        
        difference=[i-j for i,j in zip(sorted(arr)[1:],sorted(arr)[0:-1])]
        if len(set(difference))==1:
            return True
        else:
            return False

10.单调数列

如果数组是单调递增或单调递减的,那么它是 单调 

如果对于所有 i <= jnums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= jnums[i]> = nums[j],那么数组 nums 是单调递减的。

当给定的数组 nums 是单调数组时返回 true,否则返回 false

示例 1:

输入:nums = [1,2,2,3]
输出:true
class Solution:
    def isMonotonic(self, nums: List[int]) -> bool:

#法一:两次遍历,两个函数分别判断是否为递增或递减数列,当有其一成立就说明是单调数列
        return self.isDescend(nums) or self.isAscend(nums)

    def isDescend(self,nums):
        for i in range(len(nums)-1):
            if nums[i]<nums[i+1]:
                return False
        return True

    def isAscend(self,nums):
        for i in range(len(nums)-1):
            if nums[i]>nums[i+1]:
                return False
        return True

#法二:一次遍历,两个标记符号(递增和递减),有相反情况出现就是false,有其一成立为单调数列
  
        desc,asc=True,True
        for i in range(len(nums)-1):
            if nums[i]>nums[i+1]:
                asc=False
            if nums[i]<nums[i+1]:
                desc=False
        return desc or asc

【持续更新】

欢迎大家给出更好的解法或改进,共同进步~

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值