鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 304

[复制链接]
发表于 2020-1-13 00:03:31 | 显示全部楼层
阴阳神万物主 发表于 2020-1-13 00:01
这样还有不对的吗,我这小脑瓜还是太嫩了

输入[2,1,5],预期结果是1对,输出2对。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 00:09:24 | 显示全部楼层
Croper 发表于 2020-1-13 00:03
输入[2,1,5],预期结果是1对,输出2对。。

你把这一段拿去自己试试呗:
  1. from random import randint

  2. def solve2(lst:'list of int',rep=False)->int:
  3.     res = 0
  4.     temp = sorted(lst) if rep else sorted(set(lst))
  5.     for each in lst:
  6.         if each in temp[1:]:
  7.             res += temp.index(each)
  8.             temp.remove(each)
  9.     return res





  10. def func304(l:list):
  11.     l2=[]
  12.     map={}
  13.     for i in l:
  14.         exist=False
  15.         p,q=0,len(l2)
  16.         while (p<q):
  17.             n=(p+q)//2
  18.             if (i==l2[n]):
  19.                 exist=True
  20.                 map[i]=n
  21.                 break
  22.             if (l2[n]<i):
  23.                 q=n
  24.             else:
  25.                 p=n+1
  26.         if (not exist):
  27.             l2.insert(p,i)
  28.             map[i]=p
  29.     ret=0
  30.     for n in map.values():
  31.         ret+=n
  32.     return ret


  33.       

  34. for i in range(2000):
  35.     l=[randint(1,10) for _ in range(randint(i//100+2,i//50+2))]
  36.     ret1=solve2(l[:])
  37.     ret2=func304(l[:])
  38.     if (ret1!=ret2):
  39.         print()
  40.         print("error")
  41.         print(l)
  42.         print("your result=",ret1)
  43.         print("my result=",ret2)
  44.         break
  45.     if (i//50==0):
  46.         print(".",end="")
  47. else:
  48.     print("correct!")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 00:23:07 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-1-13 00:27 编辑
Croper 发表于 2020-1-13 00:09
你把这一段拿去自己试试呗:


我已经将能有的规律重新思考了一遍,无非就是 全升、全降、升降升、降升降,所以这个应当对(思考状)
  1. def solve2(lst:'list of int',rep=True)->int:
  2.     res = 0
  3.     temp = sorted(lst) if rep else sorted(set(lst))
  4.     for i in range(len(lst)):
  5.         each = lst[i]
  6.         if each in temp[1:]:
  7.             res += temp.index(each)
  8.             temp.remove(each)
  9.         elif each in temp[:1]:
  10.             if each not in lst[i+1:]:
  11.                 temp.remove(each)
  12.     return res
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 00:37:13 | 显示全部楼层
本帖最后由 Stubborn 于 2020-1-13 01:00 编辑
阴阳神万物主 发表于 2020-1-13 00:23
我已经将能有的规律重新思考了一遍,无非就是 全升、全降、升降升、降升降,所以这个应当对(思考状)


考虑下并归

  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/python3
  3. """
  4. @ version: ??
  5. @ author: Alex
  6. @ file: Algorithm
  7. @datetime: 2020/1/13 - 0:53
  8. @explain:
  9. """
  10. import random
  11. from functools import wraps
  12. import time

  13. def thisTime(func):
  14.     @wraps(func)
  15.     def wrapper(funcc, count):
  16.         start = time.time()
  17.         print(f"{count} This result-> {func(funcc(count))}")
  18.         print(f"{count} This  time -> {start - time.time()}")
  19.     return wrapper

  20. def create_random(count):
  21.     """Create random unordered data"""
  22.     data = list(range(count))
  23.     random.shuffle(data)
  24.     return data

  25. def create_reversed(count):
  26.     """Create reversed data"""
  27.     return list(range(count, 0, -1))

  28. @thisTime
  29. def func304(array:list):
  30.     """归并"""
  31.     def merge(arr, left, mid, right, res):
  32.         """合并"""
  33.         l,r,start = left, mid + 1, left
  34.         Array = [0 for _ in range(len(arr))]
  35.         while l <= mid and r <= right:
  36.             if arr[l] < arr[r]:Array[start],l,start = arr[l],l+1 , start+1
  37.             else:Array[start], r, start,res = arr[r], r+1, start +1, res + mid - l + 1
  38.         while l <= mid:Array[start],l, start = arr[l], l+1, start+1
  39.         while r <= right:Array[start], r, start = arr[r], r+1, start+1
  40.         for i in range(left, right + 1):arr[i] = Array[i]
  41.         return res

  42.     def sort(arr, left, right, res):
  43.         if left >= right: return res   # 出口
  44.         mid = (left + right) >> 1
  45.         # 分
  46.         l = sort(arr, left, mid, res)
  47.         r = sort(arr, mid+1, right, res)
  48.         # 并
  49.         return merge(arr, left, mid, right, l + r)

  50.     return sort(array, 0, len(array)-1, 0)


  51. func304(create_random, 1000)
  52. func304(create_reversed, 1000)
  53. func304(create_random, 5000)
  54. func304(create_reversed, 5000)
复制代码

评分

参与人数 2荣誉 +5 鱼币 +5 收起 理由
zltzlt + 4 + 4
Unicorn# + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 00:48:03 | 显示全部楼层
来了
尝试归并
  1. # -*- coding: utf-8 -*-
  2. def solve(nums):
  3.     count = 0
  4.     def f(i, j):
  5.         if i == j or i == j-1:
  6.             return
  7.         nonlocal count, nums
  8.         sep = (i + j)//2
  9.         f(i, sep)
  10.         f(sep, j)
  11.         temp = []
  12.         x = i
  13.         y = sep
  14.         while x < sep and y < j:
  15.             if nums[x] > nums[y]:
  16.                 temp.append(nums[x])
  17.                 count += 1
  18.                 x += 1
  19.             else:
  20.                 temp.append(nums[y])
  21.                 y += 1
  22.         for t in range(x, sep):
  23.             temp.append(nums[t])
  24.         for t in range(y, j):
  25.             temp.append(nums[t])
  26.         nums[i:j] = temp
  27.     f(0, len(nums))
  28.     return count
复制代码

评分

参与人数 2荣誉 +7 鱼币 +7 贡献 +3 收起 理由
zltzlt + 4 + 4
Stubborn + 3 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-13 00:53:17 From FishC Mobile | 显示全部楼层
Stubborn 发表于 2020-1-13 00:37
考虑下并归

巧了,我第一反应也是归并
(毕竟这是归并的例题)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 08:33:47 | 显示全部楼层
这样会超时吗?
  1. def fun304(n):
  2.     c, res = 0, []
  3.     while len(n) > 1:
  4.         res = n.pop(0)
  5.         for i in n:
  6.             if res > i:
  7.                 c += 1
  8.     return c
  9. if __name__ == '__main__':
  10.     print('示例1 输出:',fun304([2,4,1,3,5]))
  11.     print('示例2 输出:',fun304([1,2,3,4]))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3 会超时

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 10:57:33 | 显示全部楼层
本帖最后由 TJBEST 于 2020-1-13 13:30 编辑

我这次一反常态,来了一个较短的代码,速度貌似还不慢
  1. def fun304(arr):
  2.     if len(arr)< 2:
  3.         return 0
  4.     sortedList = sorted(arr)
  5.     result = 0
  6.     for each in arr:
  7.         index = sortedList.index(each)
  8.         result = result + index
  9.         del sortedList[index]
  10.     return result
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5 输入长度为 30000 的数组超时

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-13 12:57:41 | 显示全部楼层
阴阳神万物主 发表于 2020-1-13 00:23
我已经将能有的规律重新思考了一遍,无非就是 全升、全降、升降升、降升降,所以这个应当对(思考状)

我要求不重复的序列对哦,[5,1,1,5,1]结果应该是1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 14:46:01 | 显示全部楼层
厉害啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 16:30:12 | 显示全部楼层
用迭代速度还可以吧
  1. from itertools import combinations as c
  2. def p304(n):
  3.     res, ct = [], 0   
  4.     res.extend(list(c(n, 2)))
  5.     for i in res:        
  6.         if i[0] > i[1]: ct += 1
  7.     return ct
复制代码

评分

参与人数 1荣誉 +1 鱼币 +2 收起 理由
zltzlt + 1 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 16:39:40 | 显示全部楼层
TJBEST 发表于 2020-1-13 10:57
我这次一反常态,来了一个较短的代码,速度貌似还不慢

向前辈学习,速度真不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 17:25:02 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-1-13 17:31 编辑
fan1993423 发表于 2020-1-13 12:57
我要求不重复的序列对哦,[5,1,1,5,1]结果应该是1

哦,那层楼没说,要把rep参数设置为False,我补充一下说明

  1. def solve2(lst:'list of int',rep=True)->int:
  2.     '''
  3.     该函数的功能是:
  4.         统计并返回待查询列表中的逆序对总数
  5.     必要参数:
  6.         lst 为 待查询列表。
  7.     可选参数:
  8.         rep 是一个布尔值,为是否需要统计重复的逆序对。
  9.             为真,则统计重复的;
  10.             为假,则不统计,
  11.             默认值为真。
  12.     '''
  13.     res = 0
  14.     temp = sorted(lst) if rep else sorted(set(lst))
  15.     for i in range(len(lst)):
  16.         each = lst[i]
  17.         if each in temp[1:]:
  18.             res += temp.index(each)
  19.             temp.remove(each)
  20.         elif each in temp[:1]:
  21.             if each not in lst[i+1:]:
  22.                 temp.remove(each)
  23.     return res
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 17:47:18 | 显示全部楼层

但是,归并的话,如何剔除重复的逆序对呢?记忆化搜索吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 18:13:02 | 显示全部楼层
阴阳神万物主 发表于 2020-1-13 17:47
但是,归并的话,如何剔除重复的逆序对呢?记忆化搜索吗?

题目有说要去重吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 18:58:11 | 显示全部楼层
Stubborn 发表于 2020-1-13 18:13
题目有说要去重吗

但我那一楼是在回复别人提的去重的拓展32楼
我对于本题的解法最后是在26楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-13 19:54:43 From FishC Mobile | 显示全部楼层
def counter(arry):
    count = 0
    for i in arry:
        for j in arry[arry.index(i):]:
            if j < i:
                count += 1
    return count

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-14 10:10:45 | 显示全部楼层
  1. def fun304(x):
  2.     count = 0
  3.     for i in range(len(x)-1):
  4.         for j in range(len(x))[i+1:]:
  5.             if x[i] > x[j]:
  6.                 count += 1
  7.     return count
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5 超时

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-15 07:48:53 | 显示全部楼层
阴阳神万物主 发表于 2020-1-12 23:37
看了看别人的出错数据,感觉这回稳

还是会超时,原因在于 temp.index(each)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-15 07:51:16 | 显示全部楼层
阴阳神万物主 发表于 2020-1-13 00:23
我已经将能有的规律重新思考了一遍,无非就是 全升、全降、升降升、降升降,所以这个应当对(思考状)

超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-25 11:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表