运行列表的第二个最大值


20

给定一个整数列表,您的任务是输出前k个元素中的第二个最大值,对于2到输入列表长度之间的每个k

换句话说,为输入的每个前缀输出第二个最大值。

您可以为第一个元素输出任意值(其中k = 1),也可以忽略此值,因为1个元素的列表没有第二个最大值。您可以假设输入中至少包含2个元素。

最短的代码胜出。

例子

Input:
1 5 2 3 5 9 5 8
Output:
  1 2 3 5 5 5 8
Input:
1 1 2 2 3 3 4
Output:
  1 1 2 2 3 3
Input:
2 1 0 -1 0 1 2
Output:
  1 1 1 1 1 2

我的英语不是最好,如何k确定?
LiefdeWen

@LiefdeWen输出包含每个k答案的列表。
jimmy23013

2
1严格来说,它不是(第二个示例)的第二大值1,1而是降序排序时的第二个值。
乔纳森·艾伦

也许我只是愚蠢(尽管我怀疑我真的可以开始一个周末。),但是我仍然不确定这是如何工作的。有人可以给我ELI5最后一个测试用例吗?我可以解决的前两个测试用例是,只需遍历列表,确定列表的当前最小值,然后删除该项目(或更简单:对列表进行排序并删除最后一个项目)。它给出了前两个测试案例正确的结果,但显然是错误的(而且会给-1, 0, 0, 1, 1, 2最后的测试用例。)
凯文Cruijssen

1
@KevinCruijssen记住您看到的两个最大数字。在最后一种情况下,您以2为最大开始,什么也不输出,因为此时没有意义。然后在下一个迭代中将其更改为1和2,因此输出为1。直到结束时达到2,然后将2和2作为最大和第二大对象
-FryAmTheEggman

Answers:



5

外壳9 7个字节

@Zgarb节省了一两个字节

mȯ→hOtḣ

返回0第一个“第二个最大值”

讲解

         -- implicit input, e.g          [1,5,3,6]
      ḣ  -- prefixes                     [[],[1],[1,5],[1,5,3],[1,5,3,6]]
     t   -- remove the first element     [[1],[1,5],[1,5,3],[1,5,3,6]]
mȯ       -- map the composition of 3 functions
    O    --   sort                       [[1],[1,5],[1,3,5],[1,3,5,6]]
   h     --   drop the last element      [[],[1],[1,3],[1,3,5]
  →      --   return the last element    [0,1,3,5]
         -- implicit output

在线尝试!


1
您可以→hO改为映射并保存一个字节。
Zgarb


3

JavaScript(ES6),58 51 50字节

@Neil节省了1个字节

追加undefinedK = 1

a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])

测试用例

注意:此代码段JSON.stringify()用于提高可读性,作为副作用,它会转换undefinednull


1
我认为a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])只有50岁
Neil

@尼尔尼斯。:-)
Arnauld

2

Pyth,8个字节

m@Sd_2._

在线尝试!尝试测试套件!


怎么样?

根据规范,这将列表的第一个元素输出为列表中的第一个值。您可以为第一个元素输出任意值

m@Sd_2._-带有隐式输入的完整程序。

m ._Q-用变量d映射输入的前缀。
  Sd-对当前前缀进行排序。
 @-获取元素...
    _2-索引为2(第二高)。
           -隐式打印。

2

果冻,8字节

ḣJṢ€Ṗ€Ṫ€

在线尝试!

第一个值始终为0,随后的数字为每个前缀的第二个最大值。

说明

ḣJṢ€Ṗ€Ṫ€  Input: array A
 J        Enumerate indices, [1, 2, ..., len(A)]
ḣ         Head, get that many values from the start for each, forms the prefixes
  Ṣ€      Sort each
    Ṗ€    Pop each, removes the maximum
      Ṫ€  Tail each

@ Challenger5我不相信这行得通
英里

@ Challenger5那是行不通的……
Outgolfer的Erik

@EriktheOutgolfer哦,好的。
硕果累累


2

Python 2,45个字节

f=lambda l:l[1:]and f(l[:-1])+[sorted(l)[-2]]

在线尝试!

代码的右侧是不言自明的。但是,我们在左边放什么and呢?因为我们要递归连接列表的各个部分,所以如果l有两个或更多元素,则需要左侧为真,否则为空列表。l[1:]很好地满足了这个标准。




1

批处理,123字节

@set/af=s=%1
@for %%n in (%*)do @call:c %%n
@exit/b
:c
@if %1 gtr %s% set s=%1
@if %1 gtr %f% set/as=f,f=%1
@echo %s%


1

05AB1E,5个字节

找到了另一个5乘,与Erik的解决方案完全不同。任意值是列表的第一个元素。

ηε{Áθ

在线尝试!


说明

ηε{Áθ  - Full program that reads implicitly from STDIN and outputs to STDOUT.

η      - Push the Prefixes of the list.
 ε     - Apply to each element (each prefix):
  {      - Sort the prefix list.
   Á     - Shift the list to the right by 1, such that the first element goes to the 
           beginning  and the second largest one becomes the last.
    θ    - Get the last element (i.e. the second largest)
         - Print implicitly.

让我们举个例子,使其更容易理解。

  • 首先,我们得到隐式输入,假设它是[1, 5, 2, 3, 5, 9, 5, 8]

  • 然后,使用η- 推送其前缀[[1], [1, 5], [1, 5, 2], [1, 5, 2, 3], [1, 5, 2, 3, 5], [1, 5, 2, 3, 5, 9], [1, 5, 2, 3, 5, 9, 5], [1, 5, 2, 3, 5, 9, 5, 8]]

  • 现在,代码遍历列表,并使用{-对每个前缀进行排序[[1], [1, 5], [1, 2, 5], [1, 2, 3, 5], [1, 2, 3, 5, 5], [1, 2, 3, 5, 5, 9], [1, 2, 3, 5, 5, 5, 9], [1, 2, 3, 5, 5, 5, 8, 9]]

  • 然后,我们将最后一个元素移到开头:[[1], [5, 1], [5, 1, 2], [5, 1, 2, 3], [5, 1, 2, 3, 5], [9, 1, 2, 3, 5, 5], [9, 1, 2, 3, 5, 5, 5], [9, 1, 2, 3, 5, 5, 5, 8]]

  • 当然,现在代码使用θ- 获得每个子列表的最后一个元素[1, 1, 2, 3, 5, 5, 5, 8](第一个是任意值)。




1

Japt12个 10字节

输出数组由输入数组中的第一个元素组成,后跟所需的序列。

£¯YÄ n< g1

测试一下


说明

数组的隐式输入U

£

映射到UY当前索引在哪里。

¯YÄ

切片U0Y+1

n<

降序排列。

g1

获取第二个元素。

隐式输出结果数组。


1

MATL19 10字节

感谢Luis Mendo节省了9个字节!

"GX@:)SP2)

在这里尝试。

说明

"GX@:)SP2)
"                  for all the values in the input
 G                 get input
  X@:)             get values up to the iteration
      SP           sort it in descending order
        2)         get the second value
                   implicit end of loop and output

@LuisMendo哇!展示我对MATL的了解。谢谢您的帮助!
DanTheMan

1

J,13个字节

_2&{@/:~ ::#\

在线尝试!第一个元素始终为1。

说明

_2&{@/:~ ::#\
            \  Apply to prefixes
_2&{@/:~        Sort and take second-to-last atom
     /:~         Sort upwards
_2 {             Take second-to-last atom
         ::     If there's an error (i.e only one atom)
           #     Return the length of the list (1)

空间很重要。





0

迅捷 3,67字节

func g(l:[Int]){print((1..<l.count).map{l[0...$0].sorted()[$0-1]})}

测试套件。

Swift 3,65个字节

{l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int]

测试套件。


如何运行这些?

第一个是一个完整的函数,它将输入作为函数参数并打印结果。您可以完全按照测试链接中所示使用它们。但是我决定添加指令,因为很少使用第二种类型的函数,而且大多数人甚至都不知道它的存在。用法:

g(l: [1, 1, 2, 2, 3, 3, 4] )

第二个是匿名函数,例如lambdas。您可以像在Python中一样使用它,声明一个变量f并调用它:

var f = {l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int]

print(f([1, 1, 2, 2, 3, 3, 4]))

将其包装在方括号之间,然后直接调用((...)(ArrayGoesHere)):

print(({l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int])([1, 1, 2, 2, 3, 3, 4]))

0

PHP,53字节

for(;a&$n=$argv[++$i];rsort($a),print$a[1]._)$a[]=$n;

从命令行参数获取输入。输出由定界分隔,领先和落后。
运行-nr在线尝试

在PHP 7.1中产生警告;替换a&""<要修复。
或使用for(;++$i<$argc;rsort($a),print$a[1]._)$a[]=$argv[$i];(54个字节)


0

Mathematica 42字节

独立得出的答案非常类似于@Jenny_mathy,但短了3个字节

Sort[#[[;;i]]][[-2]]~Table~{i,2,Length@#}&

意识到第一次运行最大值仅占用15个字节和两个函数调用!:

Max~FoldList~#&

可以如此简洁地完成此操作,因为Max具有属性FlatOneIdentity但对于RankedMax逻辑替换而言这。不幸的是,定义属性或在现有函数上对其进行修改会占用太多字节,因此必须通过其他方式进行展平。

可以在48个字节中找到所有第n个运行最大值:

PadLeft[Sort/@Flatten/@FoldList[{##}&,{},#&@#]]&


0

k,13个字节

{x(>x)1}'1_,\

在线尝试!

           ,\ /sublists of increasing lengths (scan concat)
         1_   /remove the first sublist
{      }'     /for each sublist:
  (>x)        /    indices to permute sublist into largest to smallest
      1       /    get second index
 x            /    get sublist[that index]


0

JavaScript(ES6),43 51字节

编辑: 由于需要数字排序,因此增加了8个字节。 :(

a=>a.map((_,b)=>a.slice(0,b+1).sort((a,b)=>b-a)[1])

不过,将其保留在这里,因为如果希望按字典顺序进行排序,它会更短:

a=>a.map((_,b)=>a.slice(0,b+1).sort()[b-1])

这两个表达式都产生undefined第一个元素。

测试码


请注意,如果不是针对信誉系统,我宁愿仅对现有JS帖子进行评论。
亚伦·希尔

欢迎来到PPCG!我也不喜欢50个重复的评论阈值,但我想他们需要它来阻止垃圾邮件发送者发表评论。无论如何,我认为如果输入包含一个双位数的数字(如10.sort()默认情况下按字典顺序排序,即1,10,100,11,12,13,...,2,20,21,...),这将失败。您需要包含(a,b)=>a-b或类似内容才能按数字排序。
ETHproductions'Aug

谢谢@ETHproductions。我已经更新了数字排序,这意味着它已经不够好。那好吧。
亚伦·希尔

0

Clojure,56个字节

#(for[i(drop 2(reductions conj[]%))](nth(sort-by - i)1))

也许有更好的方法来生成这些前缀。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.