Kısa bir mülakat deneyimi

Selamlar. Mülakat deneyimlerime bir süre ara vermiştim. Yakın zamanda Linkedin üzerinden gelen bir teklifle tekrar mülakata girme şansım oldu. Aslında tam bir mülakat değildi. Başta 2 coding challenge atıldı. Klasik algoritma sorularındandı bu challengelar. Bu iki challenge için toplam 1 saat verildi. Challenge Coderbyte üzerinde yapıldı. Sorulardan biri Seating Students diğeri ise Print matrix in spiral order idi.
Birinci soru yaklaşık 25 dakikamı aldı ve çok da zor değildi açıkçası. Bu kadar uzun sürmesi baştan adam akıllı düşünüp bir mantık oturtmadan dümdüz kodu yazmaya çalışmaktan oldu sanırım. İkinci soru için 35 dakikam kalmıştı ama ne yazık ki başta kurduğum mantık ihtiyaçlarımı karşılamadı. Sonrasında daha düzgün bir mantıkla yazmaya çalıştım ama onda da vaktim kalmadı. Her zaman olduğu gibi challenge sonrası iş işten geçtikten sonra 10 dakika içerisinde kodu yazabildim ama bir anlamı yoktu tabii. 2 gün sonra bir mail aldım. %50 başarılı olduğumu ancak %100 beklediklerini yazmışlar. Coding challenge sırasında teknik bir sorunla karşılaştıysam tekrarını yapabileceklerini söylediler ama herhangi bir sorunla karşılaşmadığımdan, tamamen kendi hatam yüzünden yapamadığımdan “evet ya bi sorun oldu da beni tekrar alır mısınız” demeye yüzüm yoktu açıkçası o yüzden teşekkür edip daha yeni açılmış olan defteri kapattım.
Bu algoritma sorularında kendimi hep yetersiz görüyorum. Soru inanılmaz basit olsa da üniversite 1.sınıftan kalma travmamla “ben algoritmada iyi değilim ki ya” düşüncesiyle biraz kendimi tribe sokuyorum. Mülakatlar sonrasında çözebilmiş olmamı asla hesaba katamıyorum. Öncelikle bu sorunu çözmekle başlayacağım sanırım.
Sonraki mülakatlarda görüşmek üzere hoşçakalın.

edit: Sorular görünmüyormuş.
Seating students sorusu:

The function SeatingStudents(arr) read the array of integers stored in arr which will be in the 
following format: [K, r1, r2, r3, ...] where K represents the number of desks in a classroom, 
and the rest of the integers in the array will be in sorted order and will represent the desks
 that are already occupied. All of the desks will be arranged in 2 columns, 
 where desk #1 is at the top left, desk #2 is at the top right, desk #3 is below #1, desk #4 is below #2, etc. 
 Your program should return the number of ways 2 students can be seated next to each other. 
 This means 1 student is on the left and 1 student on the right, or 1 student is directly above or below the other student.

Print matrix in spiral order:

The input for this problem will be a matrix, or multidimensional array, which will be represented by N arrays each of N length, and your goal is to print the matrix in a spiral order. For example, if the input is:

[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

then this matrix should be printed out in a list like so:

[1, 2, 3, 6, 9, 8, 7, 4, 5]

The spiral begins at the top left of the matrix and loops around it towards the center in a clockwise pattern.
1 Beğeni

çözümlerim de aşağıdaki gibi.

def seating_students(total_seats: int, occupied_seats: list):
    total = 0
    seats = list(range(1, total_seats+1))
    for seat in seats:
        if seat in occupied_seats:
            continue
        right_seat = seat + 1
        lower_seat = seat + 2
        if seat % 2 == 0:
            if lower_seat in seats and lower_seat not in occupied_seats:
                total+=1
        if seat % 2 == 1:
            if right_seat in seats and right_seat not in occupied_seats:
                total += 1
            if lower_seat in seats and lower_seat not in occupied_seats:
                total += 1
    return total

def spiral(matrix: list):
    results = []
    status_map = {
        "RIGHT": 0,
        "DOWN": 1,
        "LEFT": 2,
        "UP": 3
    }
    current_status = status_map["RIGHT"]
    while matrix:
        if current_status == status_map["RIGHT"]:
            results.extend(matrix.pop(0))
            current_status = status_map["DOWN"]
            continue

        if current_status == status_map["DOWN"]:
            for i in range(len(matrix)-1):
                results.append(matrix[i].pop(-1))
            current_status = status_map["LEFT"]
            continue
        
        if current_status == status_map["LEFT"]:
            results.extend(matrix.pop(-1)[::-1])
            current_status = status_map["UP"]
            continue

        if current_status == status_map["UP"]:
            for i in range(len(matrix)-1, 0, -1):
                results.append(matrix[i].pop(0))
            current_status = status_map["RIGHT"]
            continue
    return results

Birinci soru yaklaşık 25 dakikamı aldı ve çok da zor değildi açıkçası. Bu kadar uzun sürmesi […]

Uzun degil ki?
Bazi IDE’lerin acilmasi 5 dakika surebiliyor.

Bu arada butun cozumler yok recurse edelim, yok son kolonu cevirip koyalim filan… Duz 6-7 variable’li indisleme varken O(n×…) hafiza kullanan insana derdinin ne oldugunu sorarim.

Zaten soru da bunun icin guzel bir soru. Bir cozumu yazan insana niye baska bir cozumu kullanmadigini sorabiliyorsun. Coderbyte’a koyan kisi bu inceligi atlamis herhalde.

Bu arada sirket de atlamis. Assignment olarak mi veriyorlar? Yaparken soru sormak, destek olmak nerede? (Yoksa duz challenge yapamayanlari elemek mi istiyorlar? Hmm)

Biraz “1 senelik programci, 5 senelik programci, 10 senelik programci” meme’i gibi olucak ama benim cozumum:

width = 10
height = 9
arr = []
for y in range(height):
    row = (list(map(lambda v: (y+1)*width + v, range(width))))
    arr.append(row)
    print(row)

def spiral(width, height, emit):
    min_x = 0
    min_y = 0
    max_x = width
    max_y = height
    dir = 0

    while min_x != max_x and min_y != max_y:
        if dir == 0:
            for x in range(min_x, max_x):
                emit(x, min_y)
            min_y += 1
            dir = 1
        elif dir == 1:
            for y in range(min_y, max_y):
                emit(max_x - 1, y)
            max_x -= 1
            dir = 2
        elif dir == 2:
            for x in range(max_x - 1, min_x - 1, -1):
                emit(x, max_y - 1)
            max_y -= 1
            dir = 3
        elif dir == 3:
            for y in range(max_y - 1, min_y - 1, -1):
                emit(min_x, y)
            min_x += 1
            dir = 0

def p(x, y):
    print(f"{arr[y][x]} ({x}, {y})")
spiral(len(arr[0]), len(arr), p)
Not

Generator sentaksini hatirlasaydim generator olarak yazardim. Olmadigi yerde indis array’leri dondurturdum ([(x,y), (x,y), …]), kolay olsun diye callback’li yazdim. Duzgunune gerek yok, C stili kadar bile enum destekleyen bir dilde yonu enuma cevirirdim.
Sonradan fark ettim ki yon sirali olarak gidiyor, yani aslinda tamamen kalkabilir.

Mulakatlerle ilgilenenlere soru: Bu kodun web sitesindeki ve bu sorudaki diger orneklerinden farki ne? Deneyimli biri bu kodu nasil savunur? X dilinde veya x ozelliklerini kullanarak nasil yazardiniz?

Bence bunun ustune gitmek lazim. 1 saatte yapilmayan seyi 20 dakikada yapmak buyuk bir fark cunku. (Yoksa 10 dakkaymis gibi rahat ve hizli mi oldu? Hakikaten olcunce zamanin ne kadar subjektif oldugunu anliyor cunku insan. Su soruya cevap yazmaya baslayali 40 dakka olmus.)

Vakit her ne olursa olsun, yapilabilen seyi challenge ortaminda yapamamanin ustune gitmek lazim, eger boyle seyler insanin karsisina cok cikacaksa. Profosyonel programlama deneyiminden bambaska bir sey olabilir. Veya aradaki oranti feci degiskenlik gosterebilir. (20 senedir sakin sakin kod yazan insan vs. deli gibi challenge calismis, ilk isini arayan insan.)

Bundan dolayi calisan adayini challenge’la yalniz birakmamak lazim. Ne yaptigi, nasil yaklastigi onemli. Ha, o kadar cok basvuru var ki, bir kismini elemek gerekiyorsa, iki noktanin arasindaki mesafeyi donduren fonksiyon filan gibi bir elek koyulur.

Diger soru acilmiyor bu arada.

3 Beğeni

Merhaba,

spiral için O(row * col) zaman karmaşıklığına sahip bir algoritma oluşturmaya çalıştım. Burada corner isimli değişken, matrisin her spiral harekette boyutunu kontrol ederek doğru satır ve sütun değerlerinin seçilmesini sağlamaya çalışıyor.

def spiral(matrice: list[list[int]]):
    max_row, max_col = len(matrice), len(matrice[0])
    row, col = 0, 0
    col_var = 1
    corner = 0
    for i in range(max_row * max_col):
        if col + corner == max_col:
            col -= 1
            row += 1
        if row + corner == max_row:
            row -= 1
            col -= 1
            col_var = -1
        if col - corner == -1 and col_var == -1:
            col = corner
            row -= 1
        if row == corner and col_var == -1:
            row = corner + 1
            col_var = 1
            corner += 1
            col = corner
        print(matrice[row][col])
        col += col_var
row = 5
col = 5
matrice = [list(range(i, i + col)) for i in range(0, row * col, col)]
for i in matrice:
    print(*i)
spiral(matrice)  
1 Beğeni

hocam aklıma gelen ilk çözüm bu oldu. test sonrası da üzerine çok düşünmedim açıkçası. sizin çözümünüzü inceleyeceğim.

anladığım kadarıyla düz challenge bile yapamayanları (benim gibileri :smiley: ) elemek istiyorlar. çünkü soruları çözerken herhangi bir meetingde değildim.

duruma göre stres yönetimim değişiyor hocam. benim için çok önemli olduğunu düşündüğüm çok sıradan bir şeyle uğraşırken bile çok stres yapabiliyorum. kronik stres sorunum var galiba.

ayrıca soruları konunun içine koydum. dediğiniz gibi sorulardan biri görünmüyormuş direkt ilk post içerisinde görebilirsiniz.
İnceleme için teşekkür ederim.