鱼C论坛

 找回密码
 立即注册
查看: 4176|回复: 48

Python:每日一题 375

[复制链接]
发表于 2020-4-14 13:21:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定一个整数数组,寻找连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

返回在找出的子数组中最短的子数组的长度。

示例:

输入:[2, 6, 4, 8, 10, 9, 15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。


欢迎大家一起答题!

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-14 13:35:34 | 显示全部楼层
本帖最后由 kinkon 于 2020-4-15 13:38 编辑

不知道理解对不对
  1. def f375(arr):
  2.     new = sorted(arr)
  3.     if new == arr:
  4.         return 0
  5.     l, r = 0, len(arr) - 1
  6.     while l <= r and new[l] == arr[l] or new[r] == arr[r] :
  7.         if new[l] == arr[l]:
  8.             l += 1
  9.         if new[r] == arr[r]:
  10.             r -= 1
  11.     return r - l + 1
复制代码


再来一个O(n)的
  1. def f375(arr):        
  2.     n = len(arr)
  3.     rp, lp = arr[0], arr[-1]
  4.     l, r = n, 0
  5.     for i in range(1, n):
  6.         if arr[i] >= rp:
  7.             rp = arr[i]
  8.         else:
  9.             r = i               
  10.     for i in range(n - 2, -1, -1):
  11.         if arr[i] <= lp:
  12.             lp = arr[i]
  13.         else:
  14.             l = i
  15.     return r - l + 1 if r > l else 0
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 13:46:23 | 显示全部楼层
占楼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-14 13:46:32 | 显示全部楼层
本帖最后由 TJBEST 于 2020-4-14 20:27 编辑

先来一个弱智的方法,可能比较慢。
  1. def fun375(arr):
  2.     M = len(arr)
  3.     sorted_arr = sorted(arr)
  4.     for left in range(0,M):
  5.         if arr[left] == sorted_arr[left]:
  6.             continue
  7.         else:
  8.             break
  9.     else:
  10.         return 0
  11.     for right in range(M-1,left-1,-1):
  12.         if arr[right] == sorted_arr[right]:
  13.             continue
  14.         else:
  15.             break
  16.     return right - left + 1
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 14:17:58 | 显示全部楼层
占个楼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 14:26:50 | 显示全部楼层
好难
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-14 14:28:20 | 显示全部楼层
本帖最后由 March2615 于 2020-4-14 15:08 编辑

这两天不是做隔夜题感觉都简单了呢

  1.     # 解题思路:
  2.     # 比较原列表和排序后的列表,找出从左往右和从右往左最先不同的位置
  3.     # 中间的即为最小子数组 -> 相减即可得到长度
复制代码


  1. def daily375(arr: list) -> int:
  2.     sort_arr = sorted(arr)
  3.     left, right = 0, len(arr)-1
  4.     for i in range(len(arr)):
  5.         if arr[i] == sort_arr[i]:
  6.             left += 1
  7.         else:
  8.             break
  9.     for j in range(len(arr)-1, -1, -1):
  10.         if arr[j] == sort_arr[j]:
  11.             right -= 1
  12.         else:
  13.             break
  14.     if left >= right:
  15.         return 0
  16.     else:
  17.         return right - left + 1
复制代码


写的短一点的话
  1. def daily375(arr: list) -> int:
  2.     diff_index = [i for i, (a, b) in enumerate(zip(arr, sorted(arr))) if a != b]
  3.     if diff_index:
  4.         return max(diff_index) - min(diff_index) + 1
  5.     else:
  6.         return 0
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 14:47:48 | 显示全部楼层
  1. list1 = eval(input())
  2. list2 = sorted(list1)
  3. p , q = 0 , len(list1)-1
  4. a = 0
  5. while True:
  6.     if list1[p] == list2[p] or list1[q] ==list2[q]:
  7.         p = p + 1
  8.         q = q - 1
  9.     else:
  10.         break
  11. print('',format(q-p+1))
复制代码

应该可以吧。。。

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 15:54:36 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-4-14 16:07 编辑
  1. def f375(arr):
  2.     a=sorted(arr)
  3.     b = [i for i in range(len(arr)) if arr[i]!=a[i]]
  4.     return b[-1]-b[0]+1
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 16:16:32 | 显示全部楼层
def new_sort(list):
        a = len(list)
        for each in list:
                if each == min(list):
                        a -= 1
                else:
                        break
        for each in reversed(list):
                if each == max(list):
                        a -=1
                else:
                        break
        print(a)

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 17:24:56 | 显示全部楼层
def func375(arr):
    temp = sorted(arr)
    length = len(arr)
    maxs = 0
    mins = 0
    for i in range(length):
        if temp[i] != arr[i]:
            mins = i
            break
    for i in range(length-1,mins,-1):
        if temp[i] !=arr[i]:
            maxs = i
            break
    return maxs-mins+1

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 22:58:13 | 显示全部楼层
本帖最后由 旅途Z 于 2020-4-15 23:33 编辑

总觉得写的有多余的部分,已修改,没有想到顺序情况返回值有问题
  1. import numpy as np


  2. def partial_sort(array):
  3.     equal_array = np.array(array).argsort()
  4.     head = 0
  5.     tail = len(equal_array)-1
  6.     flag1 = 0
  7.     flag2 = 0
  8.     while head < tail:
  9.         if equal_array[head] != head:
  10.             flag1 = 1
  11.         if equal_array[tail] != tail:
  12.             flag2 = 1
  13.         if flag1 and flag2:
  14.             break
  15.         elif not flag1:
  16.             head += 1
  17.         elif not flag2:
  18.             tail -= 1
  19.     if not flag1 and not flag2:
  20.         return 0
  21.     else:
  22.         return tail-head+1
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 00:47:19 | 显示全部楼层
  1. def fun375(a):
  2.     b=sorted(a)
  3.     if a==b:return 0
  4.     for i in range(len(a)):
  5.         if a[i]!=b[i]:
  6.             l=i
  7.             break
  8.     for j in range(-1,-len(a),-1):
  9.         if a[j]!=b[j]:
  10.             r=len(a)+j+1
  11.             break
  12.     return r-l
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 09:12:08 | 显示全部楼层
本帖最后由 776667 于 2020-4-15 09:13 编辑
  1. def fun375(x):
  2.     sorted_x = sorted(x)
  3.     if sorted_x == x:
  4.         return 0
  5.     for i in range(len(x)):
  6.         if x[i] != sorted_x[i]:
  7.             start = i
  8.             break
  9.     for i in range(len(x))[::-1]:
  10.         if x[i] != sorted_x[i]:
  11.             end = i
  12.             break
  13.     return end - start + 1
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 10:54:01 | 显示全部楼层
只有我一个人没看懂什么意思吗,什么是连续的子数组,给的例子是输入:[2, 6, 4, 8, 10, 9, 15]
输出:5,这里面的值没有一个是连续的吧,所以他的子数组是啥,完全没搞懂题目的意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 12:46:09 From FishC Mobile | 显示全部楼层
岚冰1234 发表于 2020-4-15 10:54
只有我一个人没看懂什么意思吗,什么是连续的子数组,给的例子是输入:[2, 6, 4, 8, 10, 9, 15]
输出:5, ...

最后要按升序排序的,[2, 6, 4, 8, 10, 9, 15],就得把[6,4,8,10,9]这5个元素拿出来排成升序再放回去变成[2, 4, 6, 8, 9, 10, 15],应该是这个意思了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-15 13:26:37 | 显示全部楼层
kinkon 发表于 2020-4-14 13:35
不知道理解对不对

第一段代码的 nums 是……?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-15 13:29:32 | 显示全部楼层
kinkon 发表于 2020-4-14 13:35
不知道理解对不对

第二段代码 50 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-15 13:30:07 | 显示全部楼层
TJBEST 发表于 2020-4-14 13:46
先来一个弱智的方法,可能比较慢。

43 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-15 13:30:40 | 显示全部楼层
March2615 发表于 2020-4-14 14:28
这两天不是做隔夜题感觉都简单了呢

63 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 19:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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