2011-07-01 13 views

cevap

12

Hepsini bir kümeye ekleyin. Daha sonra 1-100 ile doldurulmuş bir setten çıkarınız. İşte 0-9 için bir örnek: Ben [1, 4, 5, 6, 8, 2] listelenen vardı

>>> set(range(10)) - set([1, 4, 5, 6, 8, 2]) 
set([0, 9, 3, 7]) 
>>> 

. 0-9 aralığında hangi sayıların eksik olduğunu bulmak için, 0-9 arası bir set oluşturdum ve daha sonra seti [1, 4, 5, 6, 8, 2] ile çıkarttım. Ve [0, 9, 3, 7]'un eksik olduğunu öğrendim.

Takımlar bunun için oldukça verimlidir. Ek bir avantaj olarak, çiftler incelikle ele alınacaktır.

+1

Bu gerçekten güzel bir çözüm. – Chetan

+0

Tekrarlanan numara yok ve evet sıralanacaklar. Hayır bu ödev değil :) – curious1

+0

Eğer çıktıya ihtiyacınız varsa, kümeyi –

1

L, daha sonra

set(L).difference(xrange(101)) 

numaralarının listesi ise xrange Burada

In [1]: L=[1, 4, 5, 6, 8, 2] 

In [2]: timeit set(range(101)) - set(L) 
10000 loops, best of 3: 21.7 µs per loop 

In [3]: timeit set(L).symmetric_difference(range(101)) 
100000 loops, best of 3: 14.2 µs per loop 

In [4]: timeit set(L).difference(range(101)) 
100000 loops, best of 3: 9.73 µs per loop 
+0

“Farkı” da kullanabilirsiniz, 'symmetric_difference' aslında bir XOR –

+0

@Eli, iyi nokta, daha hızlı –

0

bir ilişkisel kullanarak awk çözüm ile ilgili bir dizi oluşturma kaydeder (anahtar değeri) dizi:

printf '%s\n' 1 4 5 6 8 2 | 
awk -F " " -v first=0 -v last=9 ' 
BEGIN { 
    for(i=first; i<=last; i++) 
    array[i] = 0 
} 
{ 
    for(i=1;i<=NF;i++) 
    array[$i] += 1 
} 
END { 
    for (num in array) 
    if (array[num] == 0) print num 
} 
' 
  • İlk olarak, biz varsayılan değer 0 olan tek bir anahtar olarak kullanılan belirli bir aralığın tüm sayıları ile bir dizi yedim.
  • Her bir giriş sayısı daha sonra awk tarafından diziye bir anahtar olarak işlenir, böylece değer 1'den artırılır.
  • Sonunda, sadece bu tuşlar artırılmamış, yani 0 değerine sahip olan (yani, sayıların giriş aralığından eksik oldukları için) basılanları alırlar.
0

bash: Eğer

# first set up an array containing the whole range 
declare -a nums 
for i in {0..100}; do 
    nums[$i]=1 
done 

# then read the file and remove the numbers from it 
while read number; do 
    unset nums[$number] 
done < file.with.numbers 

# the remaining array keys are the numbers not found in the file 
for number in "${!nums[@]}"; do 
    echo $number 
done 
İlgili konular