牛客答题(三)-Python版

1.数字字符转换成IP地址

"""
现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
例如:给出的字符串为"25525522135",
返回["255.255.22.135", "255.255.221.35"]. (顺序没有关系)
"""
def restoreIpAddresses( s ):
    IP = []
    merge = '.'
    data1 = [s[:3],s[3:6],s[6:9],s[9:]]
    IP1 = merge.join(data1)   
    IP.append(IP1)
    data2 = [s[:3],s[3:6],s[6:8],s[8:]]
    IP2 = merge.join(data2) 
    IP.append(IP2)
    return IP

s = "25525522135"
restoreIpAddresses( s )

2.重排链表

"""
将给定的单链表,要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。
例如:对于给定的单链表{10,20,30,40},将其重新排序为{10,40,20,30}.
"""
def reorderList( head ):
    new_head = []
    head1 = sorted(head,reverse=True)
    if len(head)%2!=0:
        import math
        for i in range(math.ceil(len(head)*0.5)):
            new_head.append(head[i])
            new_head.append(head1[i])
        new_head = list(new_head) 
    else:
        for i in range(int(len(head)*0.5)):
            new_head.append(head[i])
            new_head.append(head1[i])
        new_head = list(new_head)
    return new_head

head  = [10,20,30,40]
reorderList( head )

3.删除链表中有重复的元素

"""
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:给出的链表为[1,1,2,],返回[1,2].
给出的链表为[1,1,2,3],返回[1,2,3].
"""
def deleteDuplicates( head ):
    for i in head:
        if head.count(i)>1:
            head.remove(i)
    return head

head = [1,1,2]
deleteDuplicates( head )

4.滑动窗口最大值

"""
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,
他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个:
{[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1},
{2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
窗口大于数组长度的时候,返回空
"""
def maxInWindows(num, size):
    maxInWindows = []
    if len(num) >= size:
        for i in range(len(num)):
            if i + size <= (len(num)):
                maxInWindows.append(max(num[i:i + size]))
            else:
                break
    else:
        print("Please set size of windows  less than size of num!")
    return maxInWindows


num = [2, 3, 4, 2, 6, 2, 5, 1]
maxInWindows(num, 3)

5. 求最长公共前缀

"""
编写一个函数来查找字符串数组中的最长公共前缀。
"""
def longestCommonPrefix(strs):
    """
    :type strs: List[str]
    :rtype: str
    """
    if len(strs) == 0:
        return ''
    elif len(strs) == 1:
        return strs[0]
    else:
        b = sorted(strs, key=lambda x:len(x))#按字符串的长度进行排序b = ['a', 'abc', 'abca', 'abca', 'abcc']
        s = ''
        s1 = b[0]#a
        for i, v in enumerate(s1):  #对第一个字符串进行枚举,遍历其每一个字符
            l = []
            for j in b[1:]:         #从第二个字符串开始遍历之后的所有字符串
                l.append(v==j[i])   #将字符比较的bool值添加到列表l中
            if all(l):       #如果列表l中的所有值都为True
                s += v   #s = s + v
            else:
                break 
    return s


strs = ["abca", "a", "abca", "abc", "abcc"]
longestCommonPrefix(strs)

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

你可能感兴趣的:(牛客答题Python学习,python,链表,算法,数据结构,字符串)