这是我想出的,不需要额外的符号位:for i := 0 to n - 1 while A[A[i]] != A[i] swap(A[i], A[A[i]]) end whileend forfor i := 0 to n - 1 if A[i] != i then print A[i] end ifend for第一个循环对数组进行排列,因此,如果element x至少存在一次,则这些条目之一将位于position A[x]。请注意,乍一看它看起来可能不是O(n),但它是-尽管具有嵌套循环,但仍会O(N)及时运行。仅当存在一个i这样的时,才会发生交换A[i] != i,并且每个交换都将至少一个元素设置为A[i] == i,这样以前是不正确的。这意味着交换的总数(以及while循环体的执行总数)最多为N-1。第二环路打印的值x对其A[x]不等于x-由于第一循环保证,如果x存在至少一次阵列中,其中的一个实例将在A[x],这意味着它打印的那些值x中不存在在数组。