Python学习笔记@[教授]——力扣练习笔记第二组,加油啊!!!

6、有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:
输入: “()”
输出: true

示例 2:
输入: “()[]{}”
输出: true

示例 3:
输入: “(]”
输出: false

示例 4:
输入: “([)]”
输出: false

示例 5:
输入: “{[]}”
输出: true

括号匹配——典型的栈应用
1、可以利用进栈和出栈进行匹配。
2、利用python的内置函数直接进行匹配`

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        while "{}" in s or "[]" in s or "()" in s:
            s = s.replace('{}','')
            s = s.replace('()','')        
            s = s.replace('[]','')
        return s ==''
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
如:
str = "this is string example....wow!!! this is really string";
print str.replace("is", "was");
print str.replace("is", "was", 3);

以上实例输出结果如下:
thwas was string example....wow!!! thwas was really string
thwas was string example....wow!!! thwas is really string

7、移除元素

给你一个数组 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。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。

思路:
只要在数组里遍历一遍,遇到值等于val的元素,原地删除,并让后面的元素补上即可:
元素的补有两种思路:
1、逆序遍历,遇到val就pop,删除该元素。
2、从前往后,遇到等于val的元素,就用其他元素覆盖这个元素。

class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        for i in range(len(nums)-1,-1,-1):
            if val == nums[i]:
                nums.pop(i)
        return len(nums)
class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        i=0
        for data in nums:
            if data!=val:
                nums[i] = data
                i+=1
        return i

.

8、删除排序数组中的重复项

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

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

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

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

注意:
若nums = [1]
则返回的值应该是1,即[1]
思路与上题类似。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i in range(len(nums)-1,0,-1):
            if nums[i] == nums[i-1]:
                nums.pop(i)
        return len(nums)

9、 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。

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

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

示例 3:
输入: [1,3,5,6], 7
输出: 4

示例 4:
输入: [1,3,5,6], 0
输出: 0

思路:就两种情况
第一种,该元素在数组中,那么直接返回该元素的索引值即可。
第二种,该元素不在数组中,那么只要把元素插入数组中,重新排序然后再返回该元素的索引就行啦

返回索引函数: nums.index(target)
列表末尾插入元素:nums.append(target)
对数组重排序:nums.sort()

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)
        else:
            nums.append(target)
            nums.sort()
            return nums.index(target)

10、 . 实现 strStr()

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

示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2

示例 2:
输入: haystack = “aaaaa”, needle = “bba”
输出: -1

说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。

可以直接调用python的库函数,判断是否在字符串中,另一方面,注意,用index函数的时候,若needle不在haystack中时,会返回一个异常值。

class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        if needle ==[]:
            return 0
        if needle in haystack:
            return haystack.index(needle)
        else:
            return -1

附上c语言的代码,思路清晰点

#include<stdio.h>
#include<string.h>

int Find(char str1[],char str2[]){
	char *p1,*p2;
	int i,j,offset = 0;
	p1 = str1;
	p2 = str2;
	for(i = 0;i<(int)strlen(str1)-(int)strlen(str2)+1;i++){
		if(*(p1+i) == *(p2)){
			offset = i+1;
			for(j = 1;j<(int)strlen(str2);j++){
				if(*(p1+i) != *(p2))
					break;
			}
			if(j == (int)strlen(str2))
				return(offset);
		}	
	}
	return(-1);
} 

int main(){
	char s1[20],s2[20];
	int k;
	printf("请输入s1:\n");
	scanf("%s",s1);
	printf("请输入s2:\n");
	scanf("%s",s2);
	if(strlen(s1)<strlen(s2))
		printf("错误!\n");
	else{
		k = Find(s1,s2);
		if(k == -1)
			printf("在s1中未找到s2!\n");
		else
			printf("s2在s1中第一次出现的位置是:%d\n",k); 
	} 	 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值