Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
const
Count = 50;
type
MasTyp = array [1..Count + 2] of byte;
procedure Init(var mas: MasTyp);
var
alone, i: byte;
flag: boolean;
begin
Randomize;
for i := 1 to Count div 2 do
begin
mas[i] := Random(256);
mas[Count - i + 1] := mas[i];
end;
mas[Count + 1] := 0;
mas[Count + 2] := 0;
flag := True;
while flag do
begin
alone := Random(256);
for i := 1 to Count div 2 do
begin
if mas[i] = alone then
break;
end;
if i = (Count div 2) then//зависит от компилятора
begin
flag := False;
mas[Count + 1] := alone;
end;
end;
flag := True;
while flag do
begin
alone := Random(256);
for i := 1 to Count div 2 do
begin
if mas[i] = alone then
break;
end;
if i = (Count div 2) then//зависит от компилятора
begin
flag := False;
mas[Count + 2] := alone;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
mas: MasTyp;
i, n, bit, value1, value2: byte;
xor_bit, xor_byte_of_bit: array [1..8] of byte;
begin
Init(mas);
Form1.Memo1.Lines.Text := '';
for i := 1 to Count + 2 do
Form1.Memo1.Lines.Text := Form1.Memo1.Lines.Text + (IntToStr(Mas[i]) + ' ');
for i := 1 to High(xor_bit) do
begin
xor_bit[i] := 0;
xor_byte_of_bit[i] := 0;
end;
//Основной цикл---------------------------------------------------------------
for i := 1 to Count + 2 do
begin
for n := 1 to 8 do
begin
bit := Ord((mas[i] and (1 shl (n - 1))) > 0);
xor_bit[n] := xor_bit[n] xor bit;
if bit = 1 then
xor_byte_of_bit[n] := xor_byte_of_bit[n] xor mas[i];
end;
end;
//Основной цикл---------------------------------------------------------------
Form1.Memo1.Append('value1 ' + BinStr(mas[Count + 1], 8));
Form1.Memo1.Append('value2 ' + BinStr(mas[Count + 2], 8));
Form1.Memo1.Append('Xor бит');
for i := High(xor_bit) downto 1 do
begin
Form1.Memo1.Lines.Text := Form1.Memo1.Lines.Text + (IntToStr(xor_bit[i]) + ' ');
end;
Form1.Memo1.Append('Xor по группам бит');
for i := High(xor_byte_of_bit) downto 1 do
begin
Form1.Memo1.Lines.Text := Form1.Memo1.Lines.Text +
(IntToStr(xor_byte_of_bit[i]) + ' ');
if (i - 1) mod 8 = 0 then
Form1.Memo1.Lines.Text := Form1.Memo1.Lines.Text + ' ';
end;
//Поиск в группах
value1 := 0;
value2 := 0;
for i := 1 to 8 do
begin
if xor_bit[i] = 1 then
begin
if value1 = 0 then
value1 := i;
if xor_byte_of_bit[value1] <> xor_byte_of_bit[i] then
begin
value2 := i;
break;
end;
end;
end;
Form1.Memo1.Append('value1 ' + IntToStr(xor_byte_of_bit[value1]));
Form1.Memo1.Append('value2 ' + IntToStr(xor_byte_of_bit[value2]));
end; xor_full := 0;
//Основной цикл---------------------------------------------------------------
for i := 1 to Count + 2 do
begin
xor_full := xor_full xor mas[i];
...
//Поиск в группах
value1 := 0;
value2 := 0;
for i := 1 to 8 do
begin
if xor_bit[i] = 1 then
begin
value1 := xor_byte_of_bit[i];
value2 := xor_full xor value1;
break;
end;
end;
Form1.Memo1.Append('value1 ' + IntToStr(value1));
Form1.Memo1.Append('value2 ' + IntToStr(value2));var r={};
var a=[1,1,2,5,7,7,11,12,11,12];
a.forEach((x)=>{
if(!r[x])
r[x]=1;
else
delete r[x];
});#!/usr/bin/python3.4
import random
from functools import partial
from numpy.random import random_integers, shuffle
from numpy import array, uint32, unique, array_equal
def create_test_array(randsize=10000):
random_uints32 = partial(random_integers, 0, 2 ** 32 - 1)
doubles = unique(random_uints32(size=randsize))
u1 = next(iter(doubles))
while u1 in doubles:
u1 = random_uints32()
u2 = next(iter(doubles))
while u2 in doubles:
u2 = random_uints32()
arr = array(doubles, dtype=uint32)
arr.resize([len(doubles) * 2 + 2])
arr[len(doubles):len(doubles) * 2] = doubles
arr[-2] = u1
arr[-1] = u2
shuffle(arr)
return u1, u2, arr
def find_uniques(arr):
acc0 = uint32(0)
accs = array([[acc0] * 2] * 32)
masks = array([uint32(1 << i) for i in range(32)])
for val in arr:
acc0 = acc0 ^ val
for bitidx, subaccs in enumerate(accs):
subaccs[int(bool(val & masks[bitidx]))] ^= val
p1 = array([acc0, uint32(0)])
p2 = array([uint32(0), acc0])
for subaccs in accs:
if array_equal(subaccs, p1) or array_equal(subaccs, p2):
continue
return subaccs
return p1
def main():
u1, u2, arr = create_test_array()
fu1, fu2 = find_uniques(arr)
print('expected: ', sorted([u1, u2]))
print('found : ', sorted([fu1, fu2]))
if __name__ == '__main__':
main()def find_uniques(arr):
accs = array([[uint32(0)] * 2] * 32)
masks = array([uint32(1 << i) for i in range(32)])
for val in arr:
for mask, subaccs in zip(masks, accs):
subaccs[int(bool(val & mask))] ^= val
for subaccs in accs:
if subaccs[0] != 0 and subaccs[1] != 0:
return subaccs
return accs[0]Ваше решение разве не зависит от размера слова?
N имел ввиду разрядность числа, а не то, что указано в условии. Т.е. если считать разрядность числа в задаче переменной и равной b, то будет O(Nb) битовых операций и O(b²) памяти в случае с b счётчиками и O(b) памяти для его предложения.static void findunique(int nr, uint32_t *a)
{
uint32_t s[32][2] = {};
int i;
int j;
for (i = 0; i < nr; ++i)
for (j = 0; j < 32; ++j)
s[j][!!(a[i] & (1 << j))] ^= a[i];
for (j = 0; j < 32; ++j)
if (s[j][0] != 0 && s[j][1] != 0)
printf("%u %u\n", s[j][0], s[j][1]);
}
на мой взгляд, любые свёртки этого пространства до меньшего объёма приведут к выпадению информации о найденных числах…
Задачка про парные числа