7.先升后降

Description

从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。

Input

输入时一个数组,数值通过空格隔开。

Output

输出筛选之后的数组,用空格隔开。如果有多种解雇哦,则一行一种结果。

Sample Input 1 

1 2 4 7 11 10 9 15 3 5 8 6

Sample Output 1

1 2 4 7 11 10 9 8 6

def fun(arr):
    length = len(arr)
    lists = [[] for i in range(length)]
    for j in range(length):
        a = arr[j:]
        alength = len(a)
        if alength < 2:
            if alength == 0:
                continue
            elif alength == 1:
                lists[j].append(a[0])
        else:
            for i in range(alength):
                if i == 0:
                    lists[j].append(a[0])
                elif i == 1:
                    if a[1] < a[0]:
                        continue
                    else:
                        lists[j].append(a[1])
                else:
                    if len(lists[j]) == 1:
                        if a[i]>lists[j][0]:
                            lists[j].append(a[i])
                        else:
                            continue
                    else:
                        if a[i] < lists[j][len(lists[j]) - 1] and a[i] > lists[j][len(lists[j]) - 2]:
                            lists[j].pop()
                            lists[j].append(a[i])
                        elif a[i] < lists[j][len(lists[j]) - 1] and a[i] < lists[j][len(lists[j]) - 2]:
                            continue
                        else:
                            lists[j].append(a[i])
    return lists

def maxLength(a):
    maxlength = 0
    for list in a:
        maxlength = max(maxlength, len(list))
    return maxlength

def resultLists(a):
    numList = []
    maxlength = maxLength(a)
    for list in a :
        if len(list) == maxlength:
            numList.append(list)
    return numList

def prinrtFormate(arr):
    resultstr = ""
    for num in arr:
        resultstr = resultstr + " " + str(num)
    resultstr = resultstr[1:]
    return resultstr

if __name__ == "__main__":
   arr = input()
   a = [int(n) for n in arr.split(" ")]
   allarr = []
   maxarrlength = 0
   for i in range(len(a)):
       b = a[0:i+1]
       c = a[i + 1:]
       c = c[::-1]
       numList1 = resultLists(fun(b))
       numList2 = resultLists(fun(c))
       numList3 = []
       for list in numList2:
           list = list[::-1]
       numList3.append(list)
       for list1 in numList1:
           for list3 in numList3:
              allarr.append(list1+list3)
              maxarrlength = max(len(list1+list3),maxarrlength)
   allarr2 = []
   for element in allarr:
     if (element not in allarr2):
         allarr2.append(element)
   for list in allarr2:
      if len(list) == maxarrlength:
         print(prinrtFormate(list))

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一个自然语言处理模型,无法编写和运行代码。但是我可以提供以下伪代码供您参考: ```c #include <stdio.h> #include <stdlib.h> // 判断数组状态(0:未排序,1:升序,2:序,3:先升后,4:先后升) int judge(int arr[], int n) { int i = 1; while (i < n && arr[i] == arr[i-1]) { i++; } // 未排序 if (i == n) { return 0; } // 升序 if (arr[i] > arr[i-1]) { while (i < n && arr[i] > arr[i-1]) { i++; } if (i == n) { return 1; } // 先升后 else { while (i < n && arr[i] < arr[i-1]) { i++; } if (i == n) { return 3; } } } // 序 else { while (i < n && arr[i] < arr[i-1]) { i++; } if (i == n) { return 2; } // 先后升 else { while (i < n && arr[i] > arr[i-1]) { i++; } if (i == n) { return 4; } } } return -1; } // 顺序检索(返回元素下标,未找到返回-1) int seq_search(int arr[], int n, int x, int *cnt) { int i; for (i = 0; i < n; i++) { (*cnt)++; if (arr[i] == x) { return i; } } return -1; } // 二分检索(返回元素下标,未找到返回-1) int bin_search(int arr[], int l, int r, int x, int *cnt) { while (l <= r) { (*cnt)++; int mid = (l + r) / 2; if (arr[mid] == x) { return mid; } else if (arr[mid] > x) { r = mid - 1; } else { l = mid + 1; } } return -1; } // 三分检索(返回元素下标,未找到返回-1) int tri_search(int arr[], int l, int r, int x, int *cnt) { while (l <= r) { (*cnt)++; int m1 = l + (r - l) / 3; int m2 = r - (r - l) / 3; if (arr[m1] == x) { return m1; } else if (arr[m2] == x) { return m2; } else if (arr[m1] > x) { r = m1 - 1; } else if (arr[m2] < x) { l = m2 + 1; } else { l = m1 + 1; r = m2 - 1; } } return -1; } // 二分查找最大值(或最小值) int bin_max_min(int arr[], int n, int *cnt, int type) { int l = 0, r = n - 1; while (l <= r) { int mid = (l + r) / 2; (*cnt)++; if (type == 1) { // 查找最大值 if (arr[mid] > arr[mid+1]) { return arr[mid]; } else if (arr[mid] < arr[mid+1]) { l = mid + 1; } } else if (type == -1) { // 查找最小值 if (arr[mid] < arr[mid+1]) { return arr[mid]; } else if (arr[mid] > arr[mid+1]) { l = mid + 1; } } } return -1; } int main() { int n, choice, i, x, cnt = 0; printf("请输入数组长度n:"); scanf("%d", &n); int *arr = (int *)malloc(n * sizeof(int)); printf("请选择输入方式(1:人工输入,2:随机生成):"); scanf("%d", &choice); if (choice == 1) { printf("请输入%d个互不相同的整数:", n); for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } } else if (choice == 2) { srand(time(NULL)); for (i = 0; i < n; i++) { arr[i] = rand() % (10*n); for (int j = 0; j < i; j++) { if (arr[j] == arr[i]) { i--; break; } } } } printf("数组状态为:%d\n", judge(arr, n)); printf("请输入要查找的元素:"); scanf("%d", &x); int idx = seq_search(arr, n, x, &cnt); if (idx != -1) { printf("顺序检索:元素%d在数组中,关键字比较次数为%d\n", x, cnt); } else { printf("顺序检索:元素%d不在数组中,关键字比较次数为%d\n", x, cnt); } cnt = 0; if (judge(arr, n) == 1 || judge(arr, n) == 2) { idx = bin_search(arr, 0, n-1, x, &cnt); if (idx != -1) { printf("二分检索:元素%d在数组中,关键字比较次数为%d\n", x, cnt); } else { printf("二分检索:元素%d不在数组中,关键字比较次数为%d\n", x, cnt); } } else { idx = tri_search(arr, 0, n-1, x, &cnt); if (idx != -1) { printf("三分检索:元素%d在数组中,关键字比较次数为%d\n", x, cnt); } else { printf("三分检索:元素%d不在数组中,关键字比较次数为%d\n", x, cnt); } } cnt = 0; if (judge(arr, n) == 1) { int max = bin_max_min(arr, n, &cnt, 1); printf("二分查找最大值:%d,关键字比较次数为%d\n", max, cnt); } else if (judge(arr, n) == 2) { int min = bin_max_min(arr, n, &cnt, -1); printf("二分查找最小值:%d,关键字比较次数为%d\n", min, cnt); } else if (judge(arr, n) == 3) { int max = bin_max_min(arr, n, &cnt, 1); int min = bin_max_min(arr, max+1, &cnt, -1); printf("二分查找最大值:%d,关键字比较次数为%d\n", max, cnt); cnt = 0; printf("二分查找最小值:%d,关键字比较次数为%d\n", min, cnt); } else if (judge(arr, n) == 4) { int min = bin_max_min(arr, n, &cnt, -1); int max = bin_max_min(arr, min+1, &cnt, 1); printf("二分查找最小值:%d,关键字比较次数为%d\n", min, cnt); cnt = 0; printf("二分查找最大值:%d,关键字比较次数为%d\n", max, cnt); } free(arr); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值