查找第一个重复的元素


39

给定一个数组a,其中只包含从1到a.length范围内的数字,请找到第一个重复的数字,其第二次出现的索引最小。换句话说,如果重复的数字多于1个,则返回其第二次出现的索引小于另一个数字的第二次出现的索引的数字。如果没有这样的元素,您的程序/函数可能会导致不确定的行为。

例:

对于a = [2, 3, 3, 1, 5, 2],输出应为 firstDuplicate(a) = 3

有2个重复项:数字2和3。第二次出现3的索引比第二次出现2的索引小,因此答案是3。

对于a = [2, 4, 3, 5, 1],输出应为 firstDuplicate(a) = -1

这是,因此最短答案以字节为单位。

奖金:您能以O(n)的时间复杂度和O(1)的额外空间复杂度来解决它吗?


评论不作进一步讨论;此对话已转移至聊天
Martin Ender

Answers:


15

Python 2,34个字节

O(n 2)时间,O(n)空间

感谢@vaultah,节省了3个字节,而@xnor又节省了3个字节!

lambda l:l[map(l.remove,set(l))<0]

在线尝试!


1
lambda l:l[map(l.remove,set(l))<0]即使评估顺序很奇怪,它也看起来像作品。
xnor

-1如果找不到没有“页脚代码”的重复项,则不会返回该代码,该代码不计入字节数吗?我是打高尔夫球的新手,很抱歉,这是一个基本问题!
Chris_Rands

@Chris_Rands在音乐人确实询问异常是否可以而不是-1的问题下,OP说它还可以,并且音乐人的答案抛出了异常。
LiefdeWen

这花了我一段时间才能弄清楚。打的好。修改后使用条件获取l的第0个元素确实很聪明。
Thoth19

Python是否可以保证标准库函数(如set.remove)的时间和空间复杂性?
Draconis

11

JavaScript(ES6),47 36 31 25字节

感谢ThePirateBay,节省了6个字节

undefined如果不存在解决方案,则返回。

时间复杂度:O(n):-)
空间复杂度:O(n):-(

a=>a.find(c=>!(a[-c]^=1))

怎么样?

我们通过使用负数将它们保存为原始数组a的新属性来跟踪已遇到的值。这样,他们就不可能干扰原始条目。

演示版


25个字节:a=>a.find(c=>!(a[-c]^=1))

@ThePirateBay当然,哦。谢谢!
Arnauld

请注意,JavaScript中的对象可能未实现为哈希表。访问某个对象的键的时间复杂度可能不是O(1)。
tsh

6

Mathematica,24个字节

#/.{h=___,a_,h,a_,h}:>a&

Mathematica的模式匹配功能非常酷!

返回List无效输入的原件。

说明

#/.

在输入中,替换...

{h=___,a_,h,a_,h}

List具有重复元件,用前0或更多个元件之间,和之后的重复...

... :>a

与重复元素。


6

果冻,5个字节

Ṛœ-QṪ

在线尝试!

这个怎么运作

Ṛœ-QṪ  Main link. Argument: A (array)

Ṛ      Yield A, reversed.
   Q   Unique; yield A, deduplicated.
 œ-    Perform multiset subtraction.
       This removes the rightmost occurrence of each unique element from reversed
       A, which corresponds to the leftmost occurrence in A.
    Ṫ  Take; take the rightmost remaining element, i.e., the first duplicate of A.

œ-删除最右边的出现?TIL
大公埃里克(Erik the Outgolfer)

似乎-1没有重复就没有返回。根据OP,抛出异常是可以的,但是0即使它不在范围内,我也不确定是否可以。
暴民埃里克'17


4

果冻,6个字节

xŒQ¬$Ḣ

在线尝试!

返回第一个重复项,如果没有重复项,则返回0。

说明

xŒQ¬$Ḣ  Input: array M
    $   Operate on M
 ŒQ       Distinct sieve - Returns a boolean mask where an index is truthy
          for the first occurrence of an element
   ¬      Logical NOT
x       Copy each value in M that many times
     Ḣ  Head

使用像这样的索引是比较容易的事情:ŒQi0ị
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer如果没有重复的,i0将返回0,其中将索引和返回输入的最后一个值而不是0
英里

4

Japt,7个字节

æ@bX ¦Y

在线测试!

说明

 æ@   bX ¦ Y
UæXY{UbX !=Y}  Ungolfed
               Implicit: U = input array
UæXY{       }  Return the first item X (at index Y) in U where
     UbX         the first index of X in U
         !=Y     is not equal to Y.
               In other words, find the first item which has already occured.
               Implicit: output result of last expression

或者:

æ@¯Y øX

在线测试!

说明

 æ@   ¯ Y øX
UæXY{Us0Y øX}  Ungolfed
               Implicit: U = input array
UæXY{       }  Return the first item X (at index Y) in U where
     Us0Y        the first Y items of U (literally U.slice(0, Y))
          øX     contains X.
               In other words, find the first item which has already occured.
               Implicit: output result of last expression

4

Pyth,5个字节

h.-Q{

测试套件

从Q中删除Q中每个元素的第一个外观,然后返回第一个元素。


@LuisMendo好,谢谢。很抱歉造成混乱,我应该学习阅读...
Xcoder先生17年

@ Mr.Xcoder不,这是OP的错误。该信息应在质询文本中,但仅在注释中
Luis Mendo

4

Dyalog APL,27 24 20 19 13 12 11字节

⊢⊃⍨0⍳⍨⊢=⍴↑∪

现在修改为不依赖v16!在线尝试!

怎么样?(输入N

  • ⊢⊃⍨...- Ñ这个索引处:
    • ⍴↑∪- Ñ与重复取出,右填充0到适合Ñ
    • ⊢=-与N相等的元素
    • 0⍳⍨-第一个索引0。`

没关系,我误解了问题。尽管没有足够的测试用例……
Uriel

抱歉误导您,我也误解了这个问题。
英里

对我来说好像是36个字节。
2015年

哦,天哪,iota underbar不在⎕AV,是吗?
扎卡里

@Zacharý对,Classic ⎕U2378 在加载时将其转换为。在线尝试!
2015年

3

Python 3中94 92个字节

O(n)时间和O(1)额外内存。

def f(a):
 r=-1
 for i in range(len(a)):t=abs(a[i])-1;r=[r,i+1][a[t]<0>r];a[t]*=-1
 return r

在线尝试!

算法的来源

说明

该算法的基本思想是从左到右遍历每个元素,跟踪已出现的数字,并在到达已出现的数字时返回该数字,并在遍历每个元素后返回-1。

但是,它使用一种聪明的方法来存储已出现的数字而无需使用额外的内存:将它们存储为按数字索引的元素的符号。例如,如果数组是1索引的,我可以通过具有and 负数来表示2and 3已经出现的事实。a[2]a[3]


这对于ia [i]> n 会做什么?
Downgoat '17

@Downgoat再次阅读了问题。
Leaky Nun

这个问题说的1是a.length,但是对于a [i] = a.length,这不会超出范围吗?
Downgoat '17

@Downgoatt=abs(a[i])-1=a.length-1
Leaky Nun


3

Perl 6、13个字节

*.repeated[0]

试试吧


说明

  • *是在期限位置,使整个语句是一个WhateverCode拉姆达。

  • .repeated是一种方法,除了第一次看到每个值外,它会生成每个值。

    say [2, 3, 3, 3, 1, 5, 2, 3].repeated.perl; # (3, 3, 2, 3).Seq
    #   (      3, 3,       2, 3).Seq
  • [0]只是返回Seq中的第一个值。
    如果没有值,则返回Nil
    NilFailure类型的基础,所有类型都是它们自己的未定义值,因此Nil与大多数其他语言中的未定义值不同)


请注意,由于的实现会.repeated生成一个Seq,这意味着它直到您要求一个值才开始做任何工作,并且它仅做足够的工作来生成您要的内容。
因此,很容易辩称 , 如果第二个值是第一个值的重复,则它的O(n)时间复杂度最差,而O(2)时间复杂度则最大。
内存复杂性可能类似。


3

APL(Dyalog),20字节

n/⍨(,≢∪)¨,\n←⎕,2⍴¯1

在线尝试!

2⍴¯1 负一- [R E形成的长度,两个列表

⎕, 获取输入(助记符:控制台)并添加到该输入

n← 将其存储在n中

,\n的  前缀(照明累积串联)

( 对每个前缀应用以下默认功能

, [是] ravel(仅确保前缀是列表)

 不同于

 唯一元素[?](即前缀是否重复?)

n/⍨ 使用它来过滤n(删除所有元素,直到找到第一个重复的元素)

 从中选择第一个元素


哇,你被打了三遍。不过,+ 1。并且您可以添加对此功能的解释吗?
扎卡里

@Zacharý显然,我只需要使球滚动即可。干得好。
2015年

@Zacharý最终,我设法击败了所有人
2015年

3

APL(Dyalog),11个字节

根据新规则,如果不存在重复项,则会引发错误。

⊢⊃⍨⍬⍴⍳∘≢~⍳⍨

在线尝试!

⍳⍨ 每个元素首次出现的索引

~ 已经从...删除

⍳∘≢ 所有指数中

⍬⍴ 将其整形为标量(如果没有可用数据,则为零)

⊃⍨ 用它来选择(给零错误)

 论点


是的,是的,当规则更改时,您当然可以击败所有规则!
扎卡里

好吧,我绑了你。
扎卡里

3

APL,15

{⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}

似乎当没有重复项时,我们可以返回0而不是-1,(感谢Adám的评论)。因此少了3个字节。

一点描述:

⍵⍳⍵         search the argument in itself: returns for  each element the index of it's first occurrence
(⍳⍴⍵)~⍵⍳⍵   create a list of all indexes, remove those found in ⍵⍳⍵; i.e. remove all first elements
⊃⍵[...]     of all remaining elements, take the first. If the array is empty, APL returns zero

作为参考,旧解决方案在列表的末尾添加了-1,因此,如果列表结尾为空,它将包含-1,并且第一个元素为-1。

{⊃⍵[(⍳⍴⍵)~⍵⍳⍵],¯1}

tryapl.org尝试


您可以返回零而不是¯1{⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}应该这样做。
亚当

3

视网膜26 24字节

1!`\b(\d+)\b(?<=\b\1 .*)

在线尝试!说明:\b(\d+)\b依次匹配每个数字,然后向后看以查看该数字是否重复;如果是1st,则!输出匹配项,而不是匹配项的计数。不幸的是,将lookbehind放在首位似乎不起作用,否则会节省几个字节。编辑:添加了7个字节以符合-1不匹配时的返回值。感谢@MartinEnder,节省了2个字节。


2
出于记录,环视不会回溯。如果您尝试先放置它,则这将无法正常工作。我犯了很多次错误,马丁总是纠正我。
FryAmTheEggman


@ValueInk但是该测试用例的正确答案是3 ...
Neil

哦。我看错了挑战,哎呀
价值油墨

2

MATL,8字节

&=Rsqf1)

如果不存在重复则给出错误(无输出)。

MATL Online上尝试

说明

&=   % Implict input. Matrix of all pairwise equality comparisons
R    % Keep the upper triangular part (i.e. set lower part to false)
s    % Sum of each column
q    % Subtract 1
f    % Indices of nonzero values
1)   % Get first. Gives an error is there is none. Implictly display

2

R,34个字节

c((x=scan())[duplicated(x)],-1)[1]

从@djhurio的答案中删掉几个字符,但是没有足够的声誉来发表评论。


哦...我没看到这个答案;当缺少所需的值时,这对于以前的规格很有用,-1但是对于新规格,我设法将其降低了更多。这仍然很可靠,与他的做法不同,所以我给您+1!
朱塞佩

2

J,17 16字节

(*/{_1,~i.&0)@~:

怎么样?

(*/{_1,~i.&0)@~:

             @~: returns the nub sieve which is a vector with 1 for the first occurrence of an element in the argument and 0 otherwise

        i.&0     returns the first index of duplication

    _1,~         appends _1 to the index

 */              returns 0 with duplicates (product across nub sieve)

     {           select _1 if no duplicates, otherwise return the index


2

J,12个字节

,&_1{~~:i.0:

在线尝试!

说明

,&_1{~~:i.0:  Input: array M
      ~:      Nub-sieve
          0:  The constant 0
        i.    Find the index of the first occurrence of 0 (the first duplicate)
,&_1          Append -1 to M
    {~        Select the value from the previous at the index of the first duplicate

2

Dyalog APL Classic,18个字符

仅适用于⎕IO←0

     w[⊃(⍳∘≢~⍳⍨)w←¯1,⎕]

从带有前缀“ -1”的参数元素的索引列表中删除其nub的列表索引,然后选择剩下的第一个。如果在移除之后仅剩下一个空向量,则其第一个元素的定义为0,该元素用于索引产生所需-1的扩展参数。


嗯...随机前导空格是什么?+1使我超出一个字节。
扎卡里

您可能会抛出错误而不是返回错误¯1,因此可以删除¯1,并使用⎕IO←1
2015年


2

的Java(OpenJDK的8) 65个 117 109字节

以前的65字节解决方案:

r->{for(int a,b=0,z,i=0;;b=a)if((a=b|1<<(z=r[i++]))==b)return z;}

新的解决方案。包含19个字节import java.math.*;

-8个字节,感谢@Nevay

r->{int z,i=0;for(BigInteger c=BigInteger.ZERO;c.min(c=c.setBit(z=r[i++]))!=c;);return z;}

在线尝试!

编辑

我原始程序中的算法很好,但是使用的数据类型的静态大小意味着一旦大小超过某个阈值,它就会很快崩溃。

我已经更改了计算中使用的数据类型,以增加程序的内存限制以适应此限制(使用BigInteger任意精度代替intlong)。但是,这是否可算作O(1)空间复杂性值得商bat 。

我将完整地保留我的解释,但我想补充一点,我现在认为如果O(1)不作一些假设就不可能实现空间的复杂性。

证明

定义N为这样的整数2 <= N

S一个表示一系列随机整数的列表[x{1}, ..., x{N}],其中x{i}有约束1 <= x{i} <= N

每个元素精确遍历此列表所需的时间复杂度(用Big-O表示)为 O(n)

面临的挑战是在列表中找到第一个重复的值。更具体地说,我们正在搜索第一个值,S因为它是列表中上一个项目的重复项。

pq为列表中两个元素的位置,使得p < qx{p} == x{q}。我们面临的挑战是找到q满足这些条件的最小产品。

解决此问题的明显方法是遍历S并检查我们是否x{i}存在于另一个列表中T:如果x{i}不存在T,则将其存储在中T。如果x{i}确实存在T,则它是第一个重复值,因此是最小的q,因此我们将其返回。这个空间效率是O(n)

为了O(1)在保持O(n)时间复杂度的同时实现空间复杂度,我们必须在有限的空间中存储有关列表中每个对象的唯一信息。因此,任何算法都能在O(1)空间复杂度是:1.给N上限值,该上限值对应于存储特定有限数据类型的最大可能值数量所需的内存。2.对单个不可变变量的重新分配不计入复杂性,仅计入变量数(列表为多个变量)。3.(基于其他答案)列表是可变的(或至少是列表的元素是可变的),并且列表的数据类型预设为有符号整数,从而允许对列表中其他元素进行更改无需使用额外的内存。

1和3都需要有关数据类型的假设和规范,而2则只需要考虑变量数量来计算空间复杂度,而不要考虑这些变量的大小。如果这些假设都不被接受,那么将不可能同时实现O(n)时间复杂度和O(1)空间复杂度。

说明

哇,这个男孩花了一个令人尴尬的长时间思考了一下脑力。

因此,争取奖金是困难的。我们既需要整个列表恰好一次上操作跟踪其价值我们已经迭代,而无需额外的空间复杂度。

位操作解决了这些问题。我们初始化我们的O(1)“存储”(一对整数),然后遍历列表,对第一个整数中的第i个位进行或运算,然后将结果存储到第二个中。

例如,如果我们有1101,并且我们使用进行“或”运算10,我们将得到1111。如果我们再做一次OR 10,我们仍然有1101

如此,一旦我们执行“或”运算并以相同的数字结尾,便找到了重复项。数组中没有重复项将导致程序运行并引发异常。


另外,您的第二个测试包括数字100,但这是不可能的,因为数组本身只有5长
SchoolBoy

另外,由于int没有足够的存储空间,所以此操作也会失败。
SchoolBoy

@SchoolBoy好抓住。我唯一的问题是数组的大小似乎没有任何上限,因此我无法现实地更改代码来解决内存问题。
Xanderhall '17

@Xanderhall是的,但是我觉得32(或者如果您使用长64)数字太少了:p。无论哪种方式,对输入施加限制,然后分配所需的最大内存,并将其称为O(1)内存,这只是一种作弊。它仍然是O(n),因为如果输入的大小增加了,那么此上限将到达内存。这也是为什么我认为不可能创建O(n)O(1)算法的原因
SchoolBoy

@Xanderhall PS我正接近您的65岁,我是67个字节:p
SchoolBoy

2

PHP,56 44 38 32字节

for(;!${$argv[++$x]}++;);echo$x;

像这样运行:

php -nr 'for(;!${$argv[++$x]}++;);echo$x;' -- 2 3 3 1 5 2;echo
> 3

说明

for(
  ;
  !${                 // Loop until current value as a variable is truthy
    $argv[++$x]       // The item to check for is the next item from input
  }++;                // Post increment, the var is now truthy
);
echo $x;              // Echo the index of the duplicate.

调整

  • 通过使用变量而不是数组节省了12个字节
  • 通过在没有匹配项时使用“未定义行为”规则节省了6个字节。
  • 通过使用后递增而不是在每个循环后设置为1节省6个字节

复杂

从代码的注释版本可以看出,时间复杂度是线性的O(n)。在内存方面,n+1将分配最多的变量。就是这样O(n)


感谢您未使用奇怪的编码。但是您应该将error_reporting选项添加到字节数(或使用-n,这是免费的)。
泰特斯(Titus)

我们以前来过这里。PHP的通知和警告是可忽略的。我不妨将它们传送到/dev/null,这是相同的。
Aross

我倾向于记住错误的评论。:)这不是O(n)吗?
泰特斯(Titus),

是的,它是线性的
aross

如何O(1)获得更多空间?您实际上是在分配一个新变量per n,这是O(n)
Xanderhall

2

Java 8、82 78 76字节不再可行,在编辑时低于75 67 64字节

作为lambda函数:

a->{Set<Long>s=new HashSet<>();for(long i:a)if(!s.add(i))return i;return-1;}

可能可以做得更小,这非常快。

说明:

a->{                                //New lambda function with 'a' as input
    Set<Long>s=new HashSet<>();     //New set
    for(long i:a)                   //Iterate over a
        if(!s.add(i))               //If can't add to s, already exists
            return i;               //Return current value
        return-1;                   //No dupes, return -1
}

*编辑*

75 67 64字节,使用取反策略:

a->{int i=0,j;while((a[j=Math.abs(a[i++])-1]*=-1)<0);return++j;}

在线尝试!

(-3字节感谢@Nevay)

说明:

a->{                                         //New lambda expression with 'a' as input
    int i=0,j;                               //Initialise i and declare j
    while((a[j=Math.abs(a[i++])-1]*=-1)<0);  //Negate to keep track of current val until a negative is found
    return++j;                               //Return value
}

遍历数组,否定跟踪。如果没有欺骗,那就跑过去并抛出一个错误。

这些都在O(n)时间和O(n)空间复杂度上进行。


值得一提的是,这将需要被分配到一个lambda返回Number,因为ilong-1int
雅各布

@Jakob不需要,-1是整数将自动转换为long类型,而无需明确指定转换
SchoolBoy

它将隐式转换为lambda分配给long,但不是Long强制转换Function。你测试了吗?无论如何,该解决方案都可以用您的新解决方案代替。
雅各布

您可以使用原始类型Set s=new HashSet();来保存7个字节。(此外:afaik的导入java.util.*;必须包含在字节数-> +19字节中。)return语句可以为return++j,可以删除if语句a->{int i=0,j;for(;(a[j=Math.abs(a[i++])-1]*=-1)<0;);return++j;}(-3字节)。
涅瓦

2

Brachylog,5个字节

a⊇=bh

在线尝试!

说明

a⊇=bh  Input is a list.
a      There is an adfix (prefix or suffix) of the input
 ⊇     and a subsequence of that adfix
  =    whose elements are all equal.
   b   Drop its first element
    h  and output the first element of the rest.

内置的adfix a首先以长度增加的顺序列出所有前缀,然后以长度减少的顺序列出后缀。因此,输出由允许它的最短前缀(如果有)产生。如果前缀没有重复项,则程序的其余部分将因此失败,因为相等元素的每个子序列都具有长度1,并且其尾部的第一个元素不存在。如果前缀包含重复的元素,则可以选择包含两个元素的length-2子序列,然后程序返回后者。


另一个5字节的解决方案:a⊇Ċ=h,它仅查看长度为2的子集。
致命

1

C#,145个字节

using System.Linq;a=>{var d=a.Where(n=>a.Count(t=>t==n)>1);return d.Select((n,i)=>new{n,i}).FirstOrDefault(o=>d.Take(o.i).Contains(o.n))?.n??-1;}

用一个简单的循环在C#中执行此操作的方法可能要短得多,但我想在Linq上尝试。

在线尝试!

完整/格式化版本:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<int[], int> f = a =>
            {
                var d = a.Where(n => a.Count(t => t == n) > 1);
                return d.Select((n, i) => new { n, i }).FirstOrDefault(o => d.Take(o.i).Contains(o.n))?.n ?? -1;
            };

            Console.WriteLine(f(new[] { 2, 3, 3, 1, 5, 2 }));
            Console.WriteLine(f(new[] { 2, 4, 3, 5, 1 }));

            Console.ReadLine();
        }
    }
}

是简单的循环版本。但是我更喜欢Linq版本。
LiefdeWen

@LiefdeWen将其发布为答案:)尽管我通常也更喜欢Linq :)虽然也可以通过Linq缩短它的使用时间,但我现在可以确定。
TheLethalCoder

不,这个问题人数过多,我希望您对此问题投赞成票。
LiefdeWen

1

Haskell78 69字节

 fst.foldl(\(i,a)(j,x)->(last$i:[j|i<0,elem x a],x:a))(-1,[]).zip[1..]

在线尝试!

@nimi节省了9个字节

列表的基本路径。如果当前元素尚未出现(i<0)并在累加器列表(elem x a)中,则存储当前索引。否则,保持索引为-1。无论如何,都将当前元素添加到累加器列表中。

编辑:我没有足够仔细地阅读问题:此代码输出重复元素的第二个元素的索引。


您可以使用我们的“ Haskell高尔夫技巧”中“ Shorter Conditional \ ... ->(last$i:[j|i<0,elem x a],x:a)。另外:不需要f=,因为允许使用未命名的函数。
NIMI

@nimi感谢您的提示!
jferard '17

1

Python 2,71 65字节

None如果没有重复的元素,则返回

编辑: -6字节感谢@ musicman523

def f(n):
 for a in n:
	u=-abs(a)
	if n[u]<0:return-u
	n[u]=-n[u]

在线尝试!

O(n)时间复杂度,O(n)空间复杂度,O(1)辅助空间。

由于输入列表使用O(n)空间,因此空间复杂度受到限制。意味着我们的空间复杂度不能低于O(n)

确实会修改原始列表,如果不允许这样做,我们可以用129个字节以相同的复杂度进行处理

说明

由于每个元素都大于0且小于或等于列表的大小,因此列表中的每个元素a都具有索引a-1(索引为0)上的元素。我们通过说,如果索引i的元素为负,我们就可以利用它。

对于列表n中的每个元素a,我们令a的绝对值为负。(我们将其设为负数,因为python可以使用负索引对列表进行索引,否则我们需要这样做 u=abs(a)-1)。如果列表中索引u处的元素为负数,我们之前已经看过它,因此可以返回-u (以获取a的绝对值,因为所有元素均为正)。否则,我们将索引u的元素设置为负数,以记住我们之前已经看到了值a的元素。


不错的工作!65个字节
musicman523

您确定这是内存中的O(1)吗?您仍在使用n位内存来存储已经访问过的数字,即使这些位在符号中也是如此。在我看来,这是变相的O(n)
Wheat Wizard

从技术上讲,它使用O(n)空间-n个符号位。如果数组只能包含1和之间的值n(如给出的方式),则显然不起作用。
奥利弗·尼

这实际上取决于您为数字选择的表示形式。如果使用无符号数字,则这是O(n)辅助空间。如果使用带符号的数字,则符号位已经存在,表示O(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.