Saya mencoba menyelesaikan tugas menemukan elemen unik di dalam array ini. Sejauh ini saya berhasil menyelesaikan 95%, tetapi saya gagal pada 0. Saya mendapatkan kesalahan yang mengatakan bahwa diharapkan 0 dan mendapat 1.

Saya harus mendapatkan //10, yang memang benar, tetapi setelah saya gagal dalam tes online. Untuk semua nilai lain telah berlalu.

Adakah ide tentang bagaimana menyelesaikan ini dan apa yang saya lewatkan di sini?

function findOne(arr) {
  let x = arr[0];
  for (let i of arr) {
    if (i === x) {
      continue;
    } else {
      x = i;
    }
    return x;
  }
}
console.log(findOne([3, 10, 3, 3, 3]));
0
Tiago Ruivo 29 Oktober 2019, 18:09

5 jawaban

Jawaban Terbaik

Anda bisa mendapatkan semua nilai yang muncul sekali, dengan menggunakan peta untuk menghitung berapa kali setiap elemen muncul. Anda kemudian dapat mengurangi peta itu menjadi larik nilai unik:

const findUnique = arr => {
  const mapEntries = [...arr.reduce((a, v) => a.set(v, (a.get(v) || 0) + 1), new Map()).entries()]
  return mapEntries.reduce((a, v) => (v[1] === 1 && a.push(v[0]), a), [])
}

console.log(findUnique([3, 10, 3, 3, 3]))
console.log(findUnique([1, 2, 3, 2, 4]))
console.log(findUnique([4, 10, 4, 5, 3]))

Jika Anda tidak peduli dengan beberapa nilai unik, Anda bisa mengurutkan array dan menggunakan logika, daripada memeriksa setiap nilai, asalkan array hanya berisi 2 nilai berbeda, dan memiliki panjang lebih besar dari 2:

const findUnique = arr => {
  a = arr.sort((a, b) => a - b)
  if (arr.length < 3 || new Set(a).size === 1) return null
  return a[0] === a[1] ? a[a.length-1] : a[0]
}

console.log(findUnique([3, 10, 3, 3, 3]))
console.log(findUnique([3, 3, 1]))
console.log(findUnique([3, 1]))
console.log(findUnique([3, 3, 3, 3, 3]))
-1
Kobe 29 Oktober 2019, 15:54

Saya tidak begitu mengerti kode Anda. Anda mulai dengan nilai pertama dalam larik, lalu Anda mengulang larik, melewatkan apa pun yang sama, lalu mengembalikan nilai pertama yang tidak sama. Itu tidak akan menemukan nilai unik, itu hanya akan menemukan nilai pertama yang tidak sama dengan nilai pertama. Jadi misalnya, coba di array [1,2,2,2,2] dan Anda akan mendapatkan hasil 2 bukannya 1, meskipun itu jelas salah.

Sebagai gantinya, Anda dapat membuat peta dari setiap nilai dan kejadiannya, lalu memfilter menurut nilai yang sama dengan 1 di bagian akhir.

function findOne(arr) {
    const incidences = arr.reduce((map, val) => {
      map[val] = (map[val] || 0) + 1;
      return map;
    }, {});
    const values = Object.keys(incidences);
    for (let i = 0; i < values.length; ++i) {
      if (incidences[values[i]] === 1) { return values[i]; }
    }
    return null;
}

EDIT Hal di atas tidak akan mempertahankan jenis nilai (yaitu akan selalu mengonversinya menjadi string, meskipun awalnya berupa angka). Untuk mempertahankan jenisnya, Anda dapat menggunakan Peta yang sebenarnya alih-alih objek:

function findOne(arr) {
    const incidences = arr.reduce((map, val) => {
      map.set(val, (map.get(val) || 0) + 1);
      return map;
    }, new Map());
    const singletons = Array.from(incidences).filter(entry => entry[1] === 1);
    return singletons.map(singleton => singleton[0]);
}
0
IceMetalPunk 29 Oktober 2019, 15:32

Pertimbangkan hal berikut:

Ingat bahwa span = max - min + 1;

Misalkan Partition P1 menjadi span dari 0..span-1;

Misalkan Partition P2 menjadi span dari span..(2*span)-1:

Tempatkan nomor di P1 jika tidak ada di P2.

Tempatkan nomor di P2 jika sudah ada di P1.

Setelah nomornya ada di P2, jangan pertimbangkan lagi.

Jika suatu angka ada di P1 maka itu unik.

0
C. R. Ward 29 Oktober 2019, 19:11

Ini adalah cara yang lebih sederhana dan cepat:

function findOne(arr) {
  const a = arr.reduce((acc, e) => {
    e in acc || (acc[e] = 0)
    acc[e]++
    return acc
  }, {})
  return Object.keys(a).filter(k => a[k] === 1)[0] || null
}
-1
fedeghe 30 Oktober 2019, 08:21

Kode Anda rumit, Coba ini

function findOne(arr) {
  const uniqueItems = [];
  arr.forEach(item => {
    const sameItems = arr.filter(x => x === item);
    if (sameItems.length === 1) {
      uniqueItems.push(item);
    }
  });

  return uniqueItems;
}
console.log(findOne([0, 1, 1, 3, 3, 3, 4]));

Saya mendapatkan semua item unik dari array yang diteruskan, Ini mungkin memiliki beberapa item unik

-1
Abdelrhman ElSayed 29 Oktober 2019, 15:28