编程能力提升_2

目录

1.给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

2.将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

3.给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

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

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

6.给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

7.报数序列是一个整数序列,按照其中的整数的顺序进行报数,21-->1211


 

1.给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()[]{}"
输出: true

示例 2:

输入: "([)]"
输出: false

方法一:

class Solution:
    def isValid(self, s: str) -> bool:
        sls=list(s)
        lf='([{'
        rt=')]}'
        retr=[]
        #遍历每一个元素
        for i in range(len(sls)):
            #如果当前元素为左括号,直接添加到retr列表中
            if sls[i] in lf:
                retr.append(sls[i])
            #如果当前元素为右括号,分三种情况
            elif sls[i] in rt:
                #如果retr列表为空,则直接返回false
                if retr==[]:
                    return False
                #如果当前元素和retr列表中的元素不匹配则返回false
                elif lf.index(retr[-1])!=rt.index(sls[i]):
                    return False
                #其它情况即为合理情况,删除retr最末尾匹配的元素
                else:
                    retr.pop()
        return retr==[]
                

方法二:

class Solution:
    def isValid(self, s):
        while '{}' in s or '()' in s or '[]' in s:
            s = s.replace('{}', '')
            s = s.replace('[]', '')
            s = s.replace('()', '')
        return s == ''

 

2.将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        head=ListNode(0)
        cur = head
        while l1 and l2 :            
            if l1.val<l2.val:
                cur.next=l1
                l1=l1.next
                cur=cur.next
            else:
                cur.next=l2
                l2=l2.next
                cur=cur.next
        if l1==None:
                cur.next=l2
        elif l2==None:
                cur.next=l1
            
        return head.next

3.给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

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

示例 1:

给定数组 nums = [1,1,2], 
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。

方法一,但使用了额外的空间
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        ls=[]
        ls.append(nums[0])
        for i in range(1,len(nums)):
            if nums[i]!=nums[i-1]:
                ls.append(nums[i])
        return ls

方法二:标准解法

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if nums==[] or len(nums)==1:
            return len(nums)
        i=1
        #因为要动态的修改nums列表,所以使用while循环
        while i<=len(nums)-1:
            if nums[i]==nums[i-1]:
                nums.pop(i)
            else:
                i+=1
        return len(nums)

方法三:双指针的思想,但是其nums[i+1:]之后的元素并未被删除

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if nums==[] or len(nums)==1:
            return len(nums)
        i=0
        for j in range(1,len(nums)):
            #采用双指针的方式,i,j代表其索引,其中nums[:i+1]为处理好的列表,其之后为残余未处理
            if nums[i]!=nums[j]:
                i+=1
                nums[i]=nums[j]
        return i+1

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

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

示例 1:

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

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

方法一:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        while val in nums:
            nums.remove(val)
        return len(nums)

方法二:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        for i in range(len(nums)-1,-1,-1):
            if nums[i]==val:
                nums.pop(i)    
        return len(nums)

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

示例 1:

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

方法一:

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle =='':
            return 0
        if len(needle)>len(haystack):
            return -1
        #处理两个字符串长度一致问题
        if needle==haystack:
            return 0
        #下面的for循环无法处理两个字符串长度相等的情形,因此上语句单独处理        
        for i in range(0,len(haystack)-len(needle)+1):
            #len(haystack)-len(needle)加一之后才是与needle等长的字符串
            if haystack[i:i+len(needle)]==needle:
                return i
        return -1
                

方法二:

class Solution(object):
    def strStr(self, haystack, needle):
        if needle == '':
            return 0
        #无法使用haystack.index(needle)
        #因为str.index()函数找不到needle时会报错,find()不会报错,会返回-1
        return haystack.find(needle)
str.find(str, beg=0, end=len(string))

参数

  • str -- 指定检索的字符串
  • beg -- 开始索引,默认为0。
  • end -- 结束索引,默认为字符串的长度。

返回值

如果包含子字符串返回开始的索引值,否则返回-1。

index()方法语法:

str.index(str, beg=0, end=len(string))

参数

  • str -- 指定检索的字符串
  • beg -- 开始索引,默认为0。
  • end -- 结束索引,默认为字符串的长度。

返回值

如果包含子字符串返回开始的索引值,否则抛出异常。

6.给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2

示例 2:

输入: [1,3,5,6], 2
输出: 1
class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if target in nums:
            return nums.index(target)
        if target > nums[-1]:
            nums.append(target)
            return len(nums)-1
        if target < nums[0]:
            nums.insert(0,target)
            return 0        
        
        for i in range(1,len(nums)):
            if nums[i-1]<target and nums[i]>target:
                nums.insert(i,target)
                return i
        i = 0
        while i<len(nums) and nums[i]<target:
            i = i + 1
        return i

二分法查找:贴代码:

        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        low = 0
        high = len(nums)
        while low < high:
            mid = low + (high - low)/2
            if nums[mid] > target:
                high = mid
            elif nums[mid] < target:
                low = mid +1
            else:
                return mid
        return low

7.报数序列是一个整数序列,按照其中的整数的顺序进行报数,21-->1211

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被读作  "one 1"  ("一个一") , 即 11
11 被读作 "two 1s" ("两个一"), 即 21
21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

class Solution(object):
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        rstr='1'
        for i in range(1,n):
            #x,y用来盛放个数和它的字母
            x=[]
            y=[]
            #统计x,y的值
            for j in range(len(rstr)):
                if j==0:
                    x.append(rstr[0])
                    y.append(1)
                elif rstr[j-1]==rstr[j]:
                    y[-1]+=1
                else:
                    x.append(rstr[j])
                    y.append(1)
            #更新得到新的rstr
            rstr=''
            for i in range(len(x)):
                rstr=rstr+str(y[i])+x[i]
        return rstr

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值