ALGORİTMA
Staircase Problemi
Parametre olarak girilen int n değerine göre n x n matris oluştur. Satır satır # karakterini yazdır. İlk satırda n-1 kadar boşluk olsun. Son satırda 0 boşluk olsun.
public static void staircase(int n) {
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j<n-i-1){
System.out.print(" ");
}else{
System.out.print("#");
}
}
System.out.println();
}
}
System.out.println() ve System.out.print() methodu farkı için okuyunuz.
JAVA
Java SHA-256 (Advanced)
SHA-256 grilen bir metin üzerindeki veriyi belirli bir algoritmaya göre işleyerek 32 byte bir hash üretir.
Her bir byte değeri için onaltılık hexadecimal (2 hane) dönüşüm yapılır ve bu hash değeri 64 haneli onaltılık hexadecimal formatta kullanılır. Bu hash değeri ancak aynı input verisiyle elde edilebilecek bir değeri ifade eder.
Veri bütünlüğünü sağlamada kullanılır. İndirilen bir dosyanın hash değeri ile orjinal dosyanın hash değerleri karşılaştırılır ve dosya üzerinde değişiklik yapıldıysa tespit edilebilir.
Scanner input = new Scanner(System.in); //kullanıcıdan giriş almak için kullanılan bir input nesnesi oluştur.
String girisDegeri = input.next(); //kullanıcının girişi okunur ve girisDegeri adlı String değişkene atanır.
MessageDigest md = MessageDigest.getInstance("SHA-256"); // bir messageDigest nesnesi oluşturulur ve SHA-256 kullanılacağı belirtilir.
md.update(girisDegeri.getBytes()); // girilen veri byte dizisine dönüştürülür.
byte[] digest = md.digest(); //hash hesaplaması gerçekleştirilir. sonuç digest adlı bir byte dizisine kaydedilir.
StringBuffer stringbuffer = new StringBuffer(); //hexadecimal hash değerini depolamak için bir StringBuffer nesnesi oluşturulur.
for (byte b: digest)
{
stringbuffer.append(String.format("%02x", b));
} //digest byte dizisini dolaşır. Herbir byte onaltılık hexadecimal dönüşümden geçirilerek stringbuffer'a eklenir.
System.out.println(stringbuffer.toString()); //SHA-256 hash değeri ekrana yazdırılır.
catch (NoSuchAlgorithmException exception) ile exception handling işlemi yapılır.
Java MD5 (Advanced)
MD5 yaygın olarak kullanılan ve 128 bit hash değeri üreten bir kriptografik hash fonksiyonudur. Bir şifrenin tek yönlü hash değerini saklamak için kullanılabilir. Bu şekilde şifre güvenli bir şekilde saklanır. Ya da bir dosya gönderimi esnasında şifrelenir, sonra alıcıya ulaştığında da bir hash oluşturulur ve bu iki hash karşılaştırılarak dosya değiştirilip değiştirilmediği kontrol edilir. MD5’in güvenliği konusunda şüpheler bulunmaktadır.
Cevap bir üsttekiyle benzerdir.
public static void main(String[] args) {
try {
Scanner input = new Scanner(System.in);
String deger = input.next();
MessageDigest mg = MessageDigest.getInstance("MD5");
mg.update(deger.getBytes());
byte[] digest = mg.digest();
StringBuffer sb = new StringBuffer();
for(byte b: digest){
sb.append(String.format("%02x", b));
}
System.out.println(sb.toString());
} catch (NoSuchAlgorithmException e){
System.out.println("Hash olusturulurken hata");
}
}
Java Factory Pattern
Factory method tasarım kalıbı, creational bir kalıptır. Nesnelerin oluşturulma süreçlerini soyutlar ve bu nesnelerin doğrudan oluşturulmasından ziyade bir fabrikadan alınmasını sağlar. Müşteri sadece fabrikadan bir ürün talep eder, nasıl üretildiğiyle ilgilenmez. Farklı türde nesneler oluşturmak için alt sınıflar tanımlanır. Aşağıdaki hackerrank probleminde de bir Food interface’i tanımlanıyor. Alt sınıflar bu interface’i implement ederler. FoodFactory sınıfı içindeki getFood methodu da gelen isteğe göre ilgili nesneyi üretir.
import java.util.*;
import java.security.*;
interface Food {
public String getType();
}
class Pizza implements Food {
public String getType() {
return "Someone ordered a Fast Food!";
}
}
class Cake implements Food {
public String getType() {
return "Someone ordered a Dessert!";
}
}
class FoodFactory {
public Food getFood(String order) {
if ("cake".equalsIgnoreCase(order)) {
return new Cake();
} else if ("pizza".equalsIgnoreCase(order)) {
return new Pizza();
} else {
return null;
}
}
Java Singleton Pattern
Singleton tasarım kalıbı, bir sınıftan sadece bir nesne oluşturulacağı ve bu nesneye erişimin de kısıtlı olacağı zamanlarda kullanılır. Sistem daha kullanışlı ve tutarlı bir hale gelir.
class Singleton {
private static Singleton instance;
public static String str;
private Singleton() {}
static Singleton getSingleInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Java ArrayList (Data Structures)
Bu soruda açıklama kısmı uzun olduğu için biraz anlamak zorlaşıyor. Sample input incelendiğinde en üstte 5 görünüyor. Bu 5 satırlık bir girişi ifade ediyor. Bu 5 satır aşağıya doğru dizilmiş. Herbir satırın ilk numarası o satırda kaç eleman olduğunu gösteriyor. Bu 5 satırın ardından aşağıda yine 5 yazıyor. Bu da 5 adet sorgu olduğunu gösteriyor. Herbir satırda hangi sorgular olduğu yazıyor. Örneğin 1,3. Birinci satırın üçüncü elemanı. Birinci satır, listelerin tutulduğu listenin 0. indeksini ifade eder. Üçüncü eleman ise ilgili listenin ikinci indeksindeki elemanı işaret eder. Hackerrank’tan aldığım örnek kod :
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int numLines = scanner.nextInt();
List<List<Integer>> data = new ArrayList<List<Integer>>(numLines);
for(int i=0; i<numLines; i++) {
int numElems = scanner.nextInt();
List<Integer> elems = new ArrayList<Integer>(numElems);
for(int j=0; j<numElems; j++) {
int elem = scanner.nextInt();
elems.add(new Integer(elem));
}
data.add(elems);
//System.out.println("elems" + i + ": " + elems.toString());
}
int queries = scanner.nextInt();
for(int i=0; i<queries; i++) {
int x = scanner.nextInt();
int y = scanner.nextInt();
//System.out.println("x:" + x + ", y:" + y);
if(x < 1 || x > numLines) {
System.out.println("ERROR!");
continue;
}
try {
List<Integer> elemList = data.get(x-1);
if(y < 1 || y > elemList.size()) {
System.out.println("ERROR!");
continue;
}
Integer val = elemList.get(y-1);
System.out.println(val);
}
catch(Exception ex) {
System.out.println("msg:" + ex.getMessage());
ex.printStackTrace();
}
}
VERİ YAPILARI
Arrays – DS
Dizi aynı tipteki elemanları tutmaya yarayan bir veri yapısı tipidir. Bir methoda parametre olarak gelen bir ArrayList’i elemanlarını ters çevirerek geri gönderelim.
public static List<Integer> reverseArray(List<Integer> a) {
int size = a.size();
int sonIndex = a.size() -1;
for(int i=0;i<size/2;i++){
int temp = a.get(i);
a.set(i, a.get(sonIndex-i));
a.set(sonIndex-i,temp);
}
return a;
}
Detaylı Bilgi : https://www.hackerrank.com/challenges/arrays-ds/problem