当前位置:   article > 正文

刷leetcode中常用且有效的方法总结

刷leetcode中常用且有效的方法总结

刷题的时候经常会因为不知道一个方法多写很多行代码,既然有trick为何不用!你问我眼中为何常含泪水,因为我忘记方法忘的深沉。那么我决定出一期!刷题中常用且有效的方法们!将会陆续补充,有补充欢迎评论区留言

目录

python

.join()

Counter

n.sort()

sorted(n)

set()

for i in range

enumerate()

C++

ord


python

.join()

join()是 Python 中的一个字符串方法,它用于将序列(如列表、元组、集合等,但集合需要首先转换为列表或其他有序序列,因为集合是无序的)中的元素以指定的字符连接生成一个新的字符串。

  1. stack = ["home", "user", "documents"]
  2. result = "/" + "/".join(stack)
  3. print(result) # 输出: /home/user/documents

Counter

Counter 提供了一个快速简单的方式来统计哈希对象在集合中出现的次数。

        1.通过传递一个可迭代对象(如列表、元组、集合等)给 Counter 的构造函数来创建一个 Counter 对象,这个可迭代对象中的元素将会被计数:

  1. cnt = Counter(['apple', 'banana', 'apple', 'orange', 'banana', 'grape'])
  2. print(cnt) # 输出: Counter({'apple': 2, 'banana': 2, 'orange': 1, 'grape': 1})

        2.访问元素计数,你可以像访问字典一样访问 Counter 对象的元素及其计数:

  1. print(cnt['apple']) # 输出: 2
  2. print(cnt['banana']) # 输出: 2
  3. print(cnt['pear']) # 如果 pear 不在 Counter 中,则返回 0

        3.更新计数,可以使用 update() 方法来更新计数器中的计数。可以传递另一个可迭代对象或者另一个 Counter 对象:

  1. cnt.update(['apple', 'pear', 'banana'])
  2. print(cnt) # 输出: Counter({'apple': 3, 'banana': 3, 'orange': 1, 'grape': 1, 'pear': 1})

n.sort()

这是一个列表(list)的方法,它会直接对列表n进行原地(in-place)排序,即直接修改原列表,而不返回任何值(或者说返回None)。这意味着如果你尝试将n.sort()的返回值赋给另一个变量,你会得到一个None。

  1. # 使用 n.sort()
  2. my_list = [3, 1, 4, 1, 5, 9, 2]
  3. my_list.sort() # 直接修改原列表
  4. print(my_list) # 输出: [1, 1, 2, 3, 4, 5, 9]
  5. # 尝试获取 n.sort() 的返回值
  6. result = my_list.sort()
  7. print(result) # 输出: None

sorted(n)

这是一个内置函数,它可以对任何可迭代对象n进行排序,并返回一个新的列表,包含排序后的元素。原列表n不会被修改。

  1. # 使用 sorted(n)
  2. my_list = [3, 1, 4, 1, 5, 9, 2]
  3. sorted_list = sorted(my_list) # 返回新的列表,原列表不变
  4. print(sorted_list) # 输出: [1, 1, 2, 3, 4, 5, 9]
  5. print(my_list) # 输出: [1, 1, 2, 3, 4, 5, 9],原列表未变
  6. # 对元组进行排序
  7. my_tuple = (3, 1, 4, 1, 5, 9, 2)
  8. sorted_tuple = sorted(my_tuple) # 返回新的列表
  9. print(sorted_tuple) # 输出: [1, 1, 2, 3, 4, 5, 9]

set()

可能这里出现set有人会觉得很奇怪,但是我觉得set有时候真的很好用!尤其是需要筛去多余元素的时候,因为set是专用来保存无序且不重复集合的。

定义:

  • python中set是一种无序且不重复的元素集合。
  • Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔
  1. occ = set() #创建一个空集合
  2. non_empty_set = {1,2,3} #创建一个包含元素的非空集合
  3. #注意,如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {},Python 解释器会将其视为一个空字典。
  4. occ.add(1) #添加元素
  5. occ.add(2)
  6. occ.remove(1) #删除元素
  7. occ.discard(2)
  8. #删除元素,与remove的区别是,若元素不存在,使用remove会引发KeyError,使用discard不会
  9. occ.pop() #随机删除集合中元素
  10. occ.clear() #清空集合
  11. occ.copy #复制集合
  12. len(occ) #计算occ中元素个数
  13. #集合运算
  14. set1 = {1,2,3}
  15. set2 = {3,4,5}
  16. union_set = set1 | set2 #并集:{12345}
  17. intersection_set = set1&set2 #交集 {3}
  18. different_set = set1 -set2 #差集 {12}

迭代方面:

for i in range

    for i in range(n)用于正向迭代,从0到n-1。
    for i in range(start, n)用于正向迭代,从start到n-1。
    for i in range(n, -1, -1)用于逆向迭代,从n到0。

参数:<起点>, <终点>, <增量>

传入两个参数:省略增量。意味着增量是1

传入一个参数:省略起点和增量。意味着起点是0,增量是1

enumerate()

enumerate()函数常用于循环中获取(可迭代对象)元素和索引的对应关系,例如列表、元组或字符串,enumerate可以将其组成一个索引序列,利用它可以同时获得索引和值。

  1. #1.基本用法:
  2. my_list = ['apple', 'banana', 'cherry']
  3. for index, value in enumerate(my_list):
  4. print(index, value)
  5. #这段代码会输出:
  6. 0 apple
  7. 1 banana
  8. 2 cherry
  9. #2.指定起始索引
  10. my_list = ['apple', 'banana','cherry']
  11. for index, value in enumerate(my_list, start=1):
  12. print(index,value)
  13. #这段代码会输出:
  14. 1 apple
  15. 2 banana
  16. 3 cherry

装饰器

最近发现装饰器是一个非常有意思的东西,很高级!

允许你在不修改函数或类的源代码的情况下,为它们添加额外的功能或修改它们的行为。装饰器本质上是一个接受函数作为参数的可调用对象(通常是函数或类),并返回一个新函数。

  1. def my_decorator(func):
  2. def wrapper(*args, **kwargs):
  3. print("Something is happening before the function is called.")
  4. result = func(*args, **kwargs)
  5. print("Something is happening after the function is called.")
  6. return result
  7. return wrapper
  8. @my_decorator
  9. def say_hello(name):
  10. print(f"Hello, {name}!")
  11. # 当你调用 say_hello 函数时,它实际上会调用 wrapper 函数,
  12. # wrapper 函数在调用 say_hello 之前和之后都添加了一些额外的输出。
  13. say_hello("Alice")

早期的结构化编程,几乎所有的方法都是“静态方法”,而直到面向对象编程语言来临时,才被区分为了实例化方法和静态方法。而这样的区分,并不是单一从性能的角度进行考虑的,而是为了让开发更加模式化,面向对象化。

比如说人这个类,姓名、年龄等,这些属性就必须是实例化属性,而所属科目,比如灵长类,则一定是静态属性,因为这个属性并不依赖于某一个人。

(1)@classmethod

@classmethod 是一个 Python 的内置装饰器,用于定义类方法。类方法是属于类而不是实例的方法,可以通过类名或实例调用,与实例的状态无关。@classmethod 装饰的方法的第一个参数通常被命名为 cls,表示类本身。

使用方法:无需实例化,可以通过类名或实例调用

    注意:
        类方法内不可以直接调用实例方法,也不可以调用实例变量
        类和实例都可以直接调用类方法。

  1. class MyClass:
  2. @staticmethod
  3. def static_method():
  4. print("This is a static method.")
  5. @classmethod
  6. def class_method(cls):
  7. cls.static_method()
  8. print("This is a class method.")
  9. def instance_method(self):
  10. self.static_method()
  11. print("This is an instance method.")
  12. # 通过类名调用静态方法
  13. MyClass.static_method()
  14. # 输出: This is a static method.
  15. # 通过类方法调用静态方法
  16. MyClass.class_method()
  17. # 输出:
  18. # This is a static method.
  19. # This is a class method.
  20. # 创建类的实例
  21. obj = MyClass()
  22. # 通过实例调用静态方法
  23. obj.static_method()
  24. # 输出: This is a static method.
  25. # 通过实例方法调用静态方法
  26. obj.instance_method()
  27. # 输出:
  28. # This is a static method.
  29. # This is an instance method.

(2)@staticmethod

@staticmethod 是一个 Python 的一个内置装饰器,用于定义静态方法。静态方法是类中的方法,与类的实例无关,也无法访问类的实例变量或其他实例方法。静态方法通过类名调用,而不是通过实例调用。

(3)@property、@setter装饰器基本用法

    定义
    @property装饰器是Python中一个特殊的装饰器,用于定义类的属性。它提供了一种简洁的方式来定义属性的访问方法,并且可以在需要时进行计算或验证。应用于类的实例方法,将其转换为类的属性。通过使用@property装饰器,可以将一个方法定义为只读属性,也可以定义一个可读写的属性,并且可以实现属性删除。

    @setter装饰器用于定义一个属性的setter方法,用于修改属性的值。使用@setter时,我们需要在@property装饰的属性方法之后,紧跟一 个setter方法,并使用@属性名.setter来装饰该方法

    @setter通常用于以下场景:
    当一个属性的值需要计算得到,而不是直接存储在类的属性中时,我们可以使用@setter来提供一个修改属性值的接口。
    当某个属性的值需要经过一些处理后再进行存储时,我们可以使用@setter来自动执行处理操作。

C++

ord

ord(s[i]) - ord('0'):

ord()的意思时求一个字符的Ascii码。

因为程序里如果x时用字符读入的,不能把他当作数字运算,要转化为数字。

比如说“0”的Ascii码为48,"1"到“9”的Ascii码分别为49到57,所以ord(‘0’)就是等于48的,

所以改为ord(x) - 48也是对的,通过上述表达式就可以把字符转化为数字了。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号