1. sayfa
şöyle bir seri düşünelim: 12,13,890,900,910,920,930 verilen sayı da 890 olsun. 890'dan başlıycaksın. solu ve sagı dolu mu diye bakıcaksın. ikisi de dolu. devam. sonra hangisiyle arasındaki fark daha az: 900 ile. 1.yi aldık. sonra da 13 ve 910'u karşılaştırcaksın. 910'u da aldık. sonra 13 ve 920'yi. 920'yi de aldık. bitti. bu yöntemi sevmediysen şöyle bir şey olabilir: dizi sıralı verilmediyse baştan, sıralamaya gerek yok. dizideki her elemanın bizim elemana farkını bir hashmap'te tutacaksın. hashmap valuelarını sortlayacaksın. en düsük mutlak degerli 3 eleman bizim closes threemiz olacak. |
ikinci yöntem daha kullanışlı ve temiz görünüyor, çok teşekkür ederim. |
benim de aklıma hiç sort yapmadan ama birazcık uzun bir yol geldi diyelim ki verilerimiz referance Type olan static Array inimizin içinde biz de içinde bir sayı seçip o sayının bir büyügünü ve bir küçügünü arayacagız sanırım olay bu öncelikler bi tane boolen Contain methodu yazalım ki var mı yok mu bilelim olmayan bir degeri aramayalım elimizde bi tane boolean deger döndüren Contain methodu var şimdi bi tane de void preNext diye method olsun 34,546,6778,13,456,6778,53443,68789 dizini elemanları bunlar ben 13 elemanın seçtim diyelim parametre alan fonksiyonumuz içinde ve method bana 34 döndürmesi lazım 13 den küçük deger yok buraya kadar sorun yok sanırım soyler bir döngü içinde for(int i=0;i<arraySize;i++){ if(array>choosenValue){ daha onceden tanımlanan int min = 0 olacak aradaki farkın seçilen degerle en az oldugu degeri saglayan dizideki eleman o dizide seçilen dizini bir önceki veya bir sonraki degeri olmaldır. 13 sırayla 34 576 ile cıkarılacak ama her cıkarıldıktan sonra da kontrol edilecek cunku sonra gelen deger aradaki farkı daha tutarsa bu daha yakın oldugunu gösterir int max ve int min adında 2 tane deger tutacak primitve type lazım bize anlatması biraz karışık yazması biraz daha kolay ama cok basit bir mantık bence biraz Greedy oldu elbette büyük dizilerde compiler time fazlasıyla şişer. |
https://www.geeksforgeeks.org/find-the-largest-three-elements-in-an-array/ direk en kücük üç mutlak deger de bulunabilir daha az costla. |
verdiğiniz ikinci yöntem yeterli geldi. gayette güzel oldu teşekkür ederim. birinci yöntem de parçala ve fethet algoritması mantığıyla çalışıyor sanırım onuda yarın denerim. |
bu yöntem çok uğraştıracak gibi görünüyor ama genede bi denerim. ilgin için teşekkür ederim. |
Bence en pratik yol dizide aranan sayı hariç diger sayıların 3'lü kombinlerini çıkarıp onların içinde farkı en az olanı bulmak. Örnek bir implementasyon: < Resime gitmek için tıklayın > |
Heap. |
@Gökşen PASLI 2 satırda gayet iyi bir çözüm fakat sanırım aranan sayı 7'yi int dizisinden silip öyle çalıştırmak gerekiyor. |
yediye en yakınları buluyor Abs içindeki 7 yi üst satırda aranan sayı olarak ayarlamam gerekirdi orda karışıklık olmuş |
Dizi boyunca her sayiya en yakın ilk 3 ve ilk 4 sayıyı listelemek :) < Resime gitmek için tıklayın > |
map reduce ile yeni array olustururdum.. Elimdeki sayi + istenilen sayi ile olan arasindaki farki bulan. sonra bu array farka gore sort ederdim. Sorted arraydan aldigin ilk 3 eleman aradigin degeri verir. |
|
misal 14 -10 , 0 , 11 , 12 , 8 olsun elimizde 9 rakamına en yakın değeri arıyoruz. [ [14,5] , [-10, 19], [0, 9] , [11,2], [12,3],[8,1] ] sonra arrayın ikinci elemanına göre sort edersen ilk3 sana en yakını verir. Memory kullanımı ve Big-O açısından daha iyi çözümler olabilir elbette. ama it works |
Bu problem kapsamında, fark negatif cıkan sayılar için ABS ile mutlak degerleri almak doğru sonuç verir. Benim yukardaki çözümümde abs kullandım örneğin ve görüldüğü gibi doğru sonuç verdi. mahoni 'nin bahsettiği map reduce, büyük veri / big data işlemlerinde kullanılan bir algoritma, bu problemde gereksiz. |
peki, çikan sonuc negatif olursa onu eksi ile çarpıp pozitif yaparız sorun değil. geriye bir pürüz daha kalıyor aklıma takılan. şöyle açıklayayım; konsola yazdırma esnasında, değerler array içinde tutulu olsun. konsola yazdırırken dizi içindeki değeri görmek için çıkardığımız sayıyı yazdırırken "array + sayi" şeklinde yazdırmamız gerekir ancak bu şekilde değerler isabetli olur. fakat biz negatif sayıyı pozitif sayıya çevirirsek, konsola yazdırdığımız zaman dizideki sıralanmış değeri fazladan yazar. bu sorun nasıl çözülebilir ? |
@Fiasco sonuç array 'i yazıdırırken negatifi pozitif yapayım öyle yazdırayım şeklinde bir işleme bağımlı olmaman daha iyi yoksa bahsettiğin türde hata verebilir işleri zorlaştırabilir. Benim yukardaki çözümümde örneğin sonuç array'i @comb (Raku programlama dilinde array'lerin başına @ konuluyor) 'un $i endeksli elemanı ki o da bir array (yani @comb, arraylar arrayı) yani sonuç arrayi @comb[$i] (Raku programlama dilinde tüm normal / skalar degerlerin başına $ konuluyor) Sonuçları renkli basmak için <12 13 89 76 90 45 91 7 66 18> olan orjinal array de bir döngü kurup, orjinal array'deki eleman @comb[$i] 'daki elemanlardan biri ise yeşil renk bastım. Gördüğün gibi program dizideki her bir degere en yakın 3 degeri tek tek bulup basıyor. Raku programlama dili bilmiyorsan, aynı programı Python ile de yazabilirim. |
1. sayfa
diziyi sıraladıktan sonra istenilen sayıyı dizide arattıktan sonra o sayıdan bir önceki ve bir sonraki sayıyı yazdırarak yaptım fakat herzaman doğru çalışmıyor.
mesela aranan sayı dizide 1. sırada ise bi önceki sayıyı yazdıramaz çünkü orada bir sayı yok. bu durumu koşul ekleyerek giderdim fakat yamalı pantalon gibi oldu hoşuma gitti.
çözemediğim durum ise, dizide aranan sayıdan birden fazla var ise program kullanılamaz hale geliyor. örn, aranan sayı 1088, dizide iki tane 1088 var ise anlansız sonuçlar yazıyor konsola.
bu mantıkla olmayacak belliki başka nasıl yapabileceğim hakkında fikir gerekiyor..