0
点赞
收藏
分享

微信扫一扫

算法题笔记(未完待续)

在觉 2021-09-24 阅读 58
算法

算法

sort 和sorted

list_name.sort() 返回一个排序后的列表,仅被定义在list中
sorted(list_name) 返回一个新列表,可用于所有可迭代对象

key 参数/函数

list.sort()和sorted函数增加了key参数来指定一个函数,此函数将在每个元素比较之前被调用。例如通过key指定的函数来忽略字符串的大小:

```python

>>>sorted("This is a test string from Andrew".split(),key=str.lower)
['a','Andrew','from','is','string','test','this']
```

key参数的值为一个函数,此函数只有一个参数,且返回一个值用来进行比较,这个技术是快速的因为key指定的函数将准确地对每个元素调用。
更广泛的使用情况是用复杂对象的某些值来对复杂对象的序列排序,例如:

```python
>>>student_tuples =[('john','a','15'),('jane','b','12'),('dave','b','15')]
```

key=lambda元素:元素[字段索引]
例如:想对元素第二个字段排序,则key= lambda y:y[1]、

```python
>>>list = [('a',4),('b',2),('c',5),('d',3)]

print(sorted(list,key= lambda x:x[0]))
```

牛客算法题:旋转数组的最小数字

题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

示例:

```python
x=[4,5,6,7,8,1,2,3]
# 输出1
```

分析:二分查找变种,没有具体的值用来比较。那么用中间值和高低位进行比较,看处于递增还是递减序列,进行操作缩小范围。

  • 处于递增:low上移

  • 处于递减:high下移

  • 其余情况:low++缩小范围

  • 特殊情况

代码:

```python
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        if not rotateArray:
            return 0
        low = 0
        high = len(rotateArray)-1
        while low < high:
            mid = int((low+high)/2)
            # 非递减数列的情况
            if rotateArray[low] < rotateArray[high]:
                return rotateArray[low]

            if rotateArray[mid]>rotateArray[low]:
                low = mid + 1
            elif rotateArray[mid]<rotateArray[high]:
                high = mid
            else:
                low += 1
        return rotateArray[low]
A = Solution()
A.minNumberInRotateArray([4,5,6,7,8,1,2,3])
```

牛客算法题:反转链表

题目描述:
输入一个链表,反转链表后,输出新链表的表头。

我的解法:利用三个指针反转链表

牛客算法题:链表中的节点每K个一组翻转

题目描述:
将给出的链表中的节点每K个一组翻转,返回翻转后的链表。如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样,你不能更改节点中的值,只能更改节点本身。要求空间复杂度o(1)。

例如:
给定的链表是1->2->3->4->5
对于k=2,你应该返回2->1->4->3->5
对于k=3,你应该返回3->2->1->4->5

我的解法:用一个栈先把链表的节点依次存起来,再在栈里面进行节点的翻转,再把链表按照翻转后的顺序连起来。

#     class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None



# @param head ListNode类 
# @param k int整型 
# @return ListNode类

class Solution:
    def reverseKGroup(self , head , k ):
        # 储存节点的栈
        s = []
        now = head
        if not head:
            return None
        # 按照原来的顺序将节点存栈
        while now:
            s.append(now)
            now = now.next
        n = len(s)//k
        # 把栈的每k个元素(保存额节点)依次翻转
        for i in range(0,n):
            # 这里不能用reverse()函数,因为reverse()函数返回的是一个列表,不能直接赋值给原来的列表,而reversed(Target_List)返回的是一个迭代器,则可以赋值给列表
            s[k*i:k*(i+1)]= reversed(s[k*i:k*(i+1)])
        # 按照翻转后的次序重新构造链表
        for i in range (0,len(s)-1):
            s[i].next =s[i+1]
        # 注意这里最后一个节点的next指针没有改变,会指向他原来指向的那个节点形成死循环
        s[-1].next = None
        return s[0]
        # write code here

举报

相关推荐

0 条评论