美文网首页
Python物语:Leetcode 算法

Python物语:Leetcode 算法

作者: 非著名自行车运动员 | 来源:发表于2020-12-06 18:12 被阅读0次
    # coding:utf-8
    # win 10 + python3
    
    # 冒泡排序
    def bubble_sort(arr):
        for i in range(1, len(arr)):
            for j in range(0, len(arr)-i):
                if arr[j] > arr[j+1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
        return arr
    
    
    # 选择排序
    def selection_sort(arr):
        for i in range(len(arr) - 1):
            # 记录最小数的索引
            minIndex = i
            for j in range(i + 1, len(arr)):
                if arr[j] < arr[minIndex]:
                    minIndex = j
            # i 不是最小数时,将 i 和最小数进行交换
            if i != minIndex:
                arr[i], arr[minIndex] = arr[minIndex], arr[i]
        return arr
    
    
    # 插入排序
    def insertion_sort(arr):
        for i in range(len(arr)):
            preIndex = i-1
            current = arr[i]
            while preIndex >= 0 and arr[preIndex] > current:
                arr[preIndex+1] = arr[preIndex]
                preIndex-=1
            arr[preIndex+1] = current
        return arr
    
    # 数组合并去重
    a = [2,3,1]
    b = [4,3,5]
    f = a + b
    # 去重并排序
    c = set(f)
    c = list(c)
    print(c)
    # 去重并保留原有顺序
    c = sorted(c,key=f.index)
    print(c)
    
    
    # 两数之和
    # 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
    
    nums = [1, 2, 7, 11, 15]
    target = 9
    def two_sum(nums,target):
        n = len(nums)
        d = {}
        for x in range(n):
            a = target-nums[x]
            if nums[x] in d:
                return d[nums[x]],x
            else:
                d[a] = x
            print(d)
    
    # 统计字符串中字母出现次数
    def count_strnum_1():
        d = {}
        for i in s:
            d[i] = s.count(i)
        print(d)
    
    def count_strnum_2():
        d={}
        s='helloworld'
        for x in s:
            if x not in d:
                d[x]=1
            else:
                d[x]= d[x] +1  
        print(d)
    
    # 回文数
    def isPalindrome(self, x):
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
    
        revertedNumber = 0
        while x > revertedNumber:
            revertedNumber = revertedNumber * 10 + x % 10
            x = int(x/10)
        return x == revertedNumber or x == int(revertedNumber/10)
    
    # 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
    nums = [1,2,3,4,5,6,7] 
    k = 3
    def list_move():
        if nums:
          k = k % len(nums)
          nums[:]=nums[-k:] + nums[:-k]
        return nums
    
    
    # 无重复字符的最长子串
    s='wwwkewippacvbn'
    def longest_str(s):
        max_number = 0
        number = 0
        test = ''
        for i in s:
            #如果i不在test字符串里面,字符串test添加这个字符,number+1
            if i not in test:
                test += i
                number += 1
                s1=test
            else:  #i在test字符串里
                if number >= max_number:
                    max_number = number
                index = test.index(i)
                test = test[(index+1):] + i
                number=len(test)
            if number > max_number:
                max_number = number
        print(s1)
        print(max_number)
    
    """
    
    有红、黄、蓝三种颜色的气球。
    
    在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。
    
    2个红气球+1个黄气球可以兑换1个蓝气球。
    
    2个黄气球+1个蓝气球可以兑换1个红气球。
    
    2个蓝气球+1个红气球可以兑换1个黄气球。
    
    现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。
    3红 + 2黄 = 1彩票
    3黄 + 2蓝 = 1彩票
    3蓝 + 2红 = 1彩票
    """
    
    
    def three_max(r, y, b):
        min_num = min(r, y, b)
        r = r - min_num
        y = y - min_num
        b = y - min_num
        if r == 0:
            num = min_num + min(y/3, b/2)
        if y == 0:
            num = min_num + min(b/3, r/2)
        if b == 0:
            num = min_num + min(r/3, y/2)
    
        print(num)
    
    # 最长重复字符串
    def maxRepeatStr(arr):
        if not arr:
            return arr
        # 去重后的每个元素的重复字符串可能的最大长度
        len_up_border = len(arr) - len(set(arr)) + 1
        # 缓存遍历,最大长度和当前元素(分别初始化为1和最大ASCII码对应的字符)
        max_len = 1
        cur_element = chr(127)
        # res[max_len] = min_ascii_element_with_max_length
        res = {}
        # 长度反向遍历的跳出标识
        flag = False
        for i in range(len_up_border, 0, -1):
            for s in set(arr):
                spt = s * i
                # 以 spt 分割原始字符串作为判断依据:如果spt在arr中存在,则分割后长度>1; 若不存在,分割后长度=1
                splited = arr.split(spt)
                if len(splited) > 1:
                    # print('i-->', i, 's-->', s, 'splited-->', splited)
                    max_len = max(max_len, i)
                    cur_element = min(cur_element, s)
                    res[i] = cur_element
                    flag = True
            if flag:
                break
        output = [v * k for k, v in res.items()]
        return output[0]
    

    相关文章

      网友评论

          本文标题:Python物语:Leetcode 算法

          本文链接:https://www.haomeiwen.com/subject/upgowktx.html