牛客答题(二)-Python版

这篇博客涵盖了多种Python编程中的算法挑战,包括数组的最大累加和、平方根计算、链表操作如合并有序链表、寻找缺失数字、奇偶节点重排、查找未出现的最小正整数、删除链表重复元素、字符串反转以及合并有序链表。文章通过实例详细解释了每个问题的解决方案,并提供了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.子数组最大累加和问题

"""
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
"""
def maxsumofSubarray(arr):
    arr = sorted(arr,reverse=False)
    new_arr = arr[1:]
    return sum(new_arr)

arr = [1, -2, 3, 5, -2, 6, -1]    
maxsumofSubarray(arr)

new_arr = []
for i in arr:
    if i>0:
        new_arr.append(i)
sum(new_arr)

2.求平方根

"""
实现函数 int sqrt(int x).
计算并返回x的平方根(向下取整)
前提:import math
向上取整:math.ceil(x)
向下取整:math.floor(x)
取整数部分:math.trunc(x)
四舍五入:round(x)
"""
def sqrt( x ):
    import math
    return math.floor(x**0.5)
sqrt(5)

3.合并有序链表

"""
将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。
"""
def mergeTwoLists(a,b):
    newlist = []
    for i in a:
        newlist.append(i)
    for j in b:
        newlist.append(j)
    return newlist
a = {1,2}
b = {3,4}
mergeTwoLists(a,b)

4.求缺失数字

"""
从0,1,2,...,n这n+1个数中选择n个数,找出这n个数中缺失的那个数,要求O(n)尽可能小。
"""
def solve( a ):
    miss = sum(list(range(max(a)+1)))-sum(a)
    return miss

a = [0,1,2,3,4,5,7]
print(solve( a ))

a1 = [0,2,3]
print(solve( a1 ))

5.链表的奇偶重排

"""
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
"""
def oddEvenList( head ):
    new_list  = [] 
    new_list1 = []
    new_list2 = []
    head = sorted(head,reverse=False)
    for i in head:
        if i%2!=0:
            new_list1.append(i)
        else:
            new_list2.append(i)
    for p in new_list1:
        new_list.append(p)
    for q in new_list2:
        new_list.append(q)
    return new_list

head = [1,2,3,4,5,6]        
oddEvenList( head )

6.求数组中未出现的最小正整数

"""
给定一个无序数组arr,找到数组中未出现的最小正整数
例如arr = [-1, 2, 3, 4]。返回1
arr = [1, 2, 3, 4]。返回5
"""
def minNumberdisappered( arr ):
    new_arr = []
    for i in arr:
        if i+1 not in arr and i+1>0:
            new_arr.append(i+1)
        if i-1 not in arr and i-1>0:
            new_arr.append(i-1)
    return min(new_arr)
arr = [-1, 2, 3, 4]            
minNumberdisappered( arr )

arr1 = [1, 2, 3, 4]
minNumberdisappered( arr1 )

7.删除链表中重复出现的元素

"""
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为o 1→1→1→2→3, 返回2→3.
"""
def deleteDuplicates( head ):
    new_arr = []
    for i in head:
        if head.count(i)==1:
            new_arr.append(i)
    return new_arr
head  = [1,2,3,3,4,4,5]
deleteDuplicates( head )

8.反转字符串

"""
写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
"""
def solve( str ):
    new_str = ""
    for i in range(len(str)-1,-1,-1):
        new_str =  new_str+str[i]
    return new_str

str = "abcd"
solve( str )

9.合并有序链表

"""
将两个有序的链表合并为一个新链表,要求新的链表是通过
拼接两个链表的节点来生成的,且合并后新链表依然有序。
"""
def mergeTwoLists( list1 , list2 ):
    new_list = []
    for i in list1:
        new_list.append(i)
    for j in list2:
        new_list.append(j)
    new_list = sorted(new_list,reverse=False)
    return new_list
list1 = [2]
list2 = [1]
mergeTwoLists( list1 , list2 )

10.反转数字

"""
将给出的32位整数x翻转。例1:x=123,返回321,例2:x=-123,返回-321
你有注意到翻转后的整数可能溢出吗?因为给出的是32位整数,则其数值范围为[−2^{31}, 2^{31} − 1]。翻转可能会导致溢出,如果反转后的结果会溢出就返回 0。
"""
def reverse( x ):
    if x>=0:
        new_str = ""
        x = '%s' %x
        for i in range(len(x)-1,-1,-1):
            new_str =  new_str+x[i]
    else:
        new_str = "-"
        x = '%s' %abs(x)
        for i in range(len(x)-1,-1,-1):
            new_str =  new_str+x[i]
    return new_str
x = 1357924680
reverse( x )   

特别注明本文属于牛客答题Python学习笔记,不以盈利为目的,纯手工码字不容易,若整理的笔记中,对您有所助益,麻烦点个赞或者收藏,万分感谢!如有构成侵权的地方,请联系作者删除,谢谢合作!

### NC68 跳台阶问题的 Python 解法 网上的 NC68 跳台阶问题是经典的动态规划问题之一。该问题描述如下:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 #### 动态规划解法分析 此问题可以通过动态规划来解决。设 `f(n)` 表示跳到第 `n` 级台阶的方法数,则状态转移方程为: \[ f(n) = \sum_{i=1}^{n-1}{f(i)} + 1 \] 其中,初始条件为 \( f(0) = 1 \),表示当台阶数为零时有一种方法(即不跳)。通过累加之前的状态值并加上当前一步的情况即可得到最终的结果[^1]。 以下是基于以上逻辑实现的一个高效本代码: ```python class Solution: def jumpFloor(self, number: int) -> int: if number <= 0: return 0 result = 1 temp_sum = 1 for _ in range(2, number + 1): temp_sum += result result = temp_sum return result ``` 这段程序定义了一个类 `Solution` 和其内部函数 `jumpFloor` 来计算给定数量的台阶有多少种不同的跳跃方式。这里采用迭代的方式代替递归来提高效率,并减少内存消耗[^1]。 另外还存在一种更简洁但时间复杂度较高的递归写法,不过由于可能存在重复计算,在实际应用中并不推荐使用除非加入记忆化机制优化性能: ```python class Solution: memo = {} def jumpFloorRecursive(self, number: int) -> int: if number in self.memo: return self.memo[number] if number == 0 or number == 1: res = 1 else: res = sum([self.jumpFloorRecursive(i) for i in range(number)]) self.memo[number] = res return res ``` 尽管如此,对于大规模输入数据而言,建议优先考虑前者的循环累积算法以获得更好的执行速度和资源利用率[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值