Bölüm 3: Diziler
Çoktan Seçmeli · Temel Kavramlar
Soru 1: Dizinin Özellikleri
Java dizileri için aşağıdakilerden hangisi doğrudur?
C doğru: ardışık bellek hem adres hesabını hem önbelleği kolaylaştırır. B çekici ama yanlış: erişim O(1) olsa da araya ekleme sonraki öğelerin kaydırılmasını gerektirir → O(n). Boyut sabittir (A); sıralama/arama java.util.Arrays ile yapılır (D).
Klasik Soru · Temel Kavramlar
Soru 2: Dizi Kovaryansı
Bu kod derlenir mi; çalıştırıldığında ne olur ve neden?
String[] isimler = {"Ali", "Ayşe"};
Object[] nesneler = isimler;
nesneler[0] = 42;
System.out.println(nesneler.length);Cevabı göster
Derlenir. Diziler kovaryanttır: String, Object'in alt türü olduğu için String[] de Object[]'in alt türü sayılır; 42 de Integer olarak Object'e atanabilir.
Çalışırken 3. satırda ArrayStoreException: java.lang.Integer fırlatılır; println'e ulaşılmaz. Nesne gerçekte bir String[]'dir ve JVM her atamada türü denetler.
Bedel: tür hatası derleme yerine çalışma zamanında yakalanır. Jenerikler kovaryant değildir: List<Object> l = new ArrayList<String>(); zaten derlenmez.
Çoktan Seçmeli · Java'da Diziler
Soru 3: Varsayılan Değerler
Kodun çıktısı nedir?
double[] d = new double[2]; boolean[] b = new boolean[2]; String[] s = new String[2]; System.out.println(d[0] + " " + b[1] + " " + s[0]);
new ile oluşturulan dizinin her öğesi türünün varsayılan değerini alır: double → 0.0, boolean → false, nesne (String) → null (char ise '\u0000'). Yerel değişkenlerin aksine dizi öğeleri ilk değersiz kalmaz, bu yüzden C yanlış; String'in varsayılanı "" değil null'dır.
Klasik Soru · Java'da Diziler
Soru 4: Tanımlama Hataları
Numaralı satırlardan hangileri derleme hatası verir? Her birini düzeltin.
int[] a = {1, 2, 3}; // 1 int[] b; b = {4, 5}; // 2 int[] c = new int[] {6, 7}; // 3 int[] d = new int[2] {8, 9}; // 4 int n = a.length(); // 5
Cevabı göster
Hatalı satırlar: 2, 4 ve 5.
- 2: Yalın ilklendirici listesi yalnızca tanımlama satırında yazılabilir. Düzeltme:
b = new int[] {4, 5}; - 4: Boyut ile liste birlikte verilemez; boyutu öğe sayısı belirler. Düzeltme:
new int[] {8, 9} - 5:
lengthdizide metot değil alandır:a.length(String'de ises.length()).
1 ve 3 doğrudur (3, sonradan atamada da kullanılabilen yazım).
Çoktan Seçmeli · Java'da Diziler
Soru 5: Referans mı, Kopya mı?
Kodun çıktısı nedir?
int[] dizi = {1, 2, 3}; int[] r = dizi; int[] k = Arrays.copyOf(dizi, dizi.length); r[0] = 99; k[1] = 50; System.out.println(dizi[0] + " " + dizi[1]);
r = dizi yalnızca adresi kopyalar: r ve dizi heap'teki aynı nesneyi gösterir, r[0] = 99 diziyi değiştirir. Arrays.copyOf yeni bir nesne oluşturup öğeleri tek tek kopyalar (O(n)); k'deki değişiklik diziye yansımaz, bu yüzden C yanlış.
Klasik Soru · Java'da Diziler
Soru 6: java.util.Arrays
Programın çıktısı nedir? Her satırı kısaca gerekçelendirin.
int[] a = {5, 3, 8}; int[] b = {5, 3, 8}; System.out.println(a == b); System.out.println(Arrays.equals(a, b)); int[] c = Arrays.copyOf(a, 5); Arrays.sort(a); System.out.println(Arrays.toString(a) + " " + Arrays.toString(c));
Cevabı göster
false true [3, 5, 8] [5, 3, 8, 0, 0]
==referansları karşılaştırır: a ve b ayrı nesneler → false.Arrays.equalsuzunlukları ve öğeleri tek tek karşılaştırır → true (O(n)).copyOf(a, 5)yeni dizi üretir; fazladan hücreler varsayılan 0 olur. Kopya sıralamadan önce alındığı için c sırasızdır.sortyerinde sıralar (O(n log n));println(a)deseydik[I@…yazardı.
Çoktan Seçmeli · Java'da Diziler
Soru 7: Sınır Hatası
Bu kod çalıştırıldığında ne olur?
int[] a = new int[5]; for (int i = 0; i <= a.length; i++) a[i] = i;
Geçerli indisler 0…length − 1 = 0…4'tür; <= son turda a[5]'e erişir (off-by-one). Java her erişimi çalışma zamanında denetler ve istisna fırlatır; yakalanmazsa program sonlanır. D, denetim yapmayan C dilinin davranışıdır. Doğrusu i < a.length.
Çoktan Seçmeli · Dizi Algoritmaları
Soru 8: Boş Dizide Ortalama
Kullanıcı diziOku'da boyut olarak 0 girerse çıktı ne olur?
double[] dizi = diziOku(sc); // boyut 0 double toplam = 0; for (int i = 0; i < dizi.length; i++) toplam += dizi[i]; System.out.println("Ortalama: " + toplam / dizi.length);
new double[0] geçerli, boş bir dizidir; döngü hiç dönmez. 0.0 / 0 kayan noktalı bölmedir ve NaN verir. B, toplam ve bölen int olsaydı doğru olurdu. Kullanıcıya uyarı vermek daha iyidir.
Adım Adım Çalıştırma · Dizi Algoritmaları
Soru 9: Mod Hesabını İzleme
mod({5, 2, 5, 2, 9}) ne döndürür? İki değer eşit sayıda tekrar ederse hangisi seçilir?
Kopya sıralanır: eşit değerler yan yana gelir. Çağıranın dizisi bozulmaz.
İlk değer (2) şimdilik rekor: 1 kez.
s[1] = 2 == s[0] → aynı değer sürüyor, mevcut = 2.
2 > 1 → yeni rekor: enCok = 2, 2 kez.
s[2] = 5 ≠ 2 → yeni değer, sayaç 1'e döner. 1 > 2 yanlış.
s[3] = 5 == s[2] → mevcut = 2.
2 > 2 yanlış: karşılaştırma > olduğu için eşitlikte rekor değişmez.
s[4] = 9 ≠ 5 → sayaç 1. Döngü biter.
return 2. 2 ve 5 ikişer kez geçer; önce görülen (en küçük) 2 kalır. O(n log n) + O(n).
static int mod(int[] dizi) { int[] s = dizi.clone(); Arrays.sort(s); int enCok = s[0], enCokSayi = 1; int mevcut = 1; for (int i = 1; i < s.length; i++) { if (s[i] == s[i - 1]) mevcut++; else mevcut = 1; if (mevcut > enCokSayi) { enCokSayi = mevcut; enCok = s[i]; } } return enCok; }
Çoktan Seçmeli · Dizi Algoritmaları
Soru 10: Sıralamasız Mod
Mod metodundan Arrays.sort satırı silinirse aşağıdaki kod ne yazdırır?
int[] s = {1, 4, 2, 4, 3, 4}; // sırasız int enCok = s[0], enCokSayi = 1, mevcut = 1; for (int i = 1; i < s.length; i++) { if (s[i] == s[i - 1]) mevcut++; else mevcut = 1; if (mevcut > enCokSayi) { enCokSayi = mevcut; enCok = s[i]; } } System.out.println(enCok);
Algoritma yalnızca komşu eşitlikleri sayar. Sırasız dizide hiçbir komşu eşit değildir; mevcut hep 1 kalır, rekor hiç değişmez ve ilk öğe 1 döner. Gerçek mod 4'tür (A), ama 4'ler yan yana olmadığı için bulunamaz; bu yüzden önce sıralama gerekir.
Klasik Soru · Dizi Algoritmaları
Soru 11: Sezar Şifresi
sifrele("YAZ", 4) ne döndürür ve şifreli metni çözmek için aynı metot hangi k ile çağrılmalıdır?
static String sifrele(String mesaj, int k) { char[] harf = mesaj.toCharArray(); for (int i = 0; i < harf.length; i++) { int sira = harf[i] - 'A'; harf[i] = (char) ('A' + (sira + k) % 26); } return new String(harf); }
Cevabı göster
| harf | sıra | (sıra + 4) % 26 | sonuç |
|---|---|---|---|
| Y | 24 | 28 % 26 = 2 | C |
| A | 0 | 4 | E |
| Z | 25 | 29 % 26 = 3 | D |
Sonuç: "CED". % 26 sona taşan sırayı başa sarar.
Çözmek için k = 26 − 4 = 22: sifrele("CED", 22) → "YAZ".
String değiştirilemez; bu yüzden harfler toCharArray() ile bir char[]'e kopyalanıp yerinde değiştirilir. char değerleri tamsayıdır. Her harf bir kez işlenir: O(n).
Klasik Soru · Çok Boyutlu Diziler
Soru 12: Düzensiz Dizide null Satır
Kod çalıştırıldığında ekrana ne yazılır ve son satırda ne olur?
int[][] m = new int[3][]; m[1] = new int[4]; m[1][2] = 5; System.out.println(m.length + " " + m[1].length + " " + m[0]); System.out.println(m[0][0]);
Cevabı göster
İlk satır: 3 4 null. Son satırda NullPointerException.
- Java'da matris, dizilerin dizisidir.
new int[3][]yalnızca 3 referanslık dış diziyi oluşturur; satırlar henüz yoktur (null). m.lengthsatır sayısı (3),m[1].lengtho satırın kendi boyu (4). Satırların boyu farklı olabilir: düzensiz (jagged) dizi.m[0]null olduğundanm[0][0]erişimi istisna fırlatır. Çözüm: öncem[0] = new int[k];
Klasik Soru · Çok Boyutlu Diziler
Soru 13: Sığ ve Derin Kopya
Programın çıktısı nedir? Her değeri sığ/derin kopya kavramıyla açıklayın.
int[][] m = { {1, 2}, {3, 4} }; int[][] s = m.clone(); int[][] d = { m[0].clone(), m[1].clone() }; s[1][0] = 8; d[0][0] = 6; s[0] = new int[] {0, 0}; System.out.println(m[0][0] + " " + m[1][0] + " " + s[0][0] + " " + d[1][0]);
Cevabı göster
Çıktı: 1 8 0 3
m.clone()yalnızca dış diziyi kopyalar: s'nin satır referansları m'ninkilerle aynıdır (sığ kopya).s[1][0] = 8ortak satırı değiştirir →m[1][0] = 8.s[0] = new int[]…yalnızca s'nin kendi dış dizisindeki referansı değiştirir; m[0] etkilenmez →m[0][0] = 1,s[0][0] = 0.- d'nin satırları ayrı ayrı klonlandı (derin kopya); d[1] klonlandığında m[1][0] henüz 3'tü →
d[1][0] = 3. d'deki değişiklik m'yi etkilemez.
Çoktan Seçmeli · Çok Boyutlu Diziler
Soru 14: Üç Boyutlu Dizi
Döngüler bitince u[2][1][0] kaçtır ve en içteki atama kaç kez çalışmıştır?
int[][][] u = new int[3][3][3]; for (int x = 0; x < 3; x++) for (int y = 0; y < 3; y++) for (int z = 0; z < 3; z++) u[x][y][z] = x * 9 + y * 3 + z + 1;
2·9 + 1·3 + 0 + 1 = 22. Her boyut bir iç içe döngü demektir: 3 × 3 × 3 = 27 atama. B "+1"i unutur; C yalnızca iki döngü sayar; D ağırlıkları karıştırır (x·3 + y·9).
Klasik Soru · Karmaşıklık
Soru 15: Araya Ekleme
a = {3, 8, 2, 6, 0, 0} ve boyut = 4 iken ekle(a, 4, 1, 5) sonrası dizi ve dönüş değeri nedir? Kaydırma neden sağdan başlar?
static int ekle(int[] a, int boyut, int indis, int deger) { // ön koşul: boyut < a.length for (int k = boyut; k > indis; k--) a[k] = a[k - 1]; // sağa kaydır a[indis] = deger; return boyut + 1; }
Cevabı göster
| adım | a |
|---|---|
| k = 4: a[4] = a[3] | {3, 8, 2, 6, 6, 0} |
| k = 3: a[3] = a[2] | {3, 8, 2, 2, 6, 0} |
| k = 2: a[2] = a[1] | {3, 8, 8, 2, 6, 0} |
| a[1] = 5 | {3, 5, 8, 2, 6, 0} |
Sonuç {3, 5, 8, 2, 6, 0}, dönüş 5; 3 kaydırma.
Soldan başlansaydı a[2] = a[1] ile 2'nin üzerine yazılır, ardından 8 sağa doğru çoğalırdı: veri kaybolur. Başa ekleme n kaydırma → O(n); yer varken sona ekleme O(1).
Çoktan Seçmeli · Karmaşıklık
Soru 16: Sıralı Girdide Sıralama
Zaten artan sırada olan n öğeli bir dizi veriliyor. Aşağıdaki algoritmalardan hangisi bu girdide O(n) sürede biter?
Eklemelide her anahtar solundakiyle bir kez karşılaştırılır, kaydırma olmaz: n − 1 karşılaştırma → O(n). Seçimli her durumda n(n−1)/2 karşılaştırma yapar (O(n²)); birleştirme her durumda O(n log n) ve O(n) ek bellek ister. D en çekici yanlış: sıralı girdi + ilk öğe pivot, hızlı sıralamanın en kötü durumudur, O(n²). (Arrays.sort ilkel dizilerde çift pivotlu hızlı sıralama, nesne dizilerinde kararlı TimSort kullanır.)
Klasik Soru · Karmaşıklık
Soru 17: Seçimli Sıralama
Seçimli sıralama {29, 10, 14, 37, 13} dizisine uygulanıyor. Her turdan sonra dizi nasıl görünür ve toplam kaç karşılaştırma yapılır?
Her tur, sıralanmamış kısmın en küçüğünü bulur ve o kısmın başındaki öğeyle takas eder.
Cevabı göster
| tur | takas | dizi |
|---|---|---|
| 1 | 29 ↔ 10 | {10, 29, 14, 37, 13} |
| 2 | 29 ↔ 13 | {10, 13, 14, 37, 29} |
| 3 | 14 yerinde | {10, 13, 14, 37, 29} |
| 4 | 37 ↔ 29 | {10, 13, 14, 29, 37} |
Karşılaştırma: 4 + 3 + 2 + 1 = 10 = n(n − 1)/2. Bu sayı girdiden bağımsızdır: en iyi, ortalama ve en kötü durum O(n²); ek bellek O(1). Son öğe kendiliğinden yerine oturduğu için n − 1 tur yeter.
Adım Adım Çalıştırma · Karmaşıklık
Soru 18: Eklemeli Sıralamayı İzleme
eklemeliSirala({6, 3, 8, 2}) çalışırken toplam kaç kaydırma (a[j] = a[j - 1]) yapılır?
Sıralı kısım {6}. Anahtar 3 bir kenara alınır.
6 > 3 → 6 bir sağa kayar; j = 0.
j == 0: başa gelindi, a[0] = 3. İlk 2 öğe sıralı.
Anahtar 8.
6 > 8 yanlış → while hiç dönmez; 8 yerinde kalır.
Anahtar 2: sıralı kısmın hepsinden küçük.
8 > 2 → sağa kayar.
6 > 2 → sağa kayar.
3 > 2 → sağa kayar; j = 0.
a[0] = 2 → sıralı. 4 kaydırma = ters sıralı çift sayısı: (6,3), (6,2), (3,2), (8,2). En kötü O(n²), sıralı dizide O(n).
static void eklemeliSirala(int[] a) { for (int k = 1; k < a.length; k++) { int anahtar = a[k]; int j = k; while (j > 0 && a[j - 1] > anahtar) { a[j] = a[j - 1]; // sağa kaydır j--; } a[j] = anahtar; // yerleş } }
Çoktan Seçmeli · Özet
Soru 19: Sık Yapılan Hatalar
a ve b birer int[] olmak üzere, hangi kod belirtilen amacı doğru gerçekleştirir?
clone() yeni bir dizi oluşturur; b'deki değişiklik a'ya yansımaz (A). B referansları karşılaştırır, içerik için Arrays.equals gerekir. C [I@… gibi tür@adres basar; Arrays.toString kullanılmalı. D en sinsi olanı: ikili arama sıralı dizi ister; örneğin {8, 3, 5, 1}'de 8'i aramak −5 (bulunamadı) döndürür.