BLOG

#1 Go Algoritma Problemi

1 Eki 2023
#go#leetcode#algoritma#algorithm

Bu yazıda LeetCode üzerinde bir algoritma problemi olarak gördüğüm, kelime ters çevirmeye bakacağız.

LeetCode üzerinde görmek için buraya tıklayabilirsiniz.


Problem

Paramete olarak bir s string şeklinde cümle veriliyor. Çıktı olarak kelimelerin sırası korunarak, sadece kelimelerin kendi içinde ters çevrilmesi isteniyor.

Örnek olarak;

Örnek Verilen İstenen
1 Let's take LeetCode contest s'teL ekat edoCteeL tsetnoc
2 God Ding doG gniD

Örneklerde gördüğümüz üzere kelimenin cümle içerisindeki sırası değişmeden, kelime içerisindeki harflerin sırası ters çevrilecek şekilde bir isteğimiz var.

Çözüm

Çözümümüz genel olarak 3 parçadan oluşuyor.

  1. Cümleyi kelimelere ayır
  2. Ayrılan kelimeleri ters çevir
  3. Ters çevrilen kelimeleri birleştir.

1. Cümleyi kelimelere ayır

go
func reverseWords(s string) string {
	words := strings.Fields(s)
    // veya
    words := strings.Split(s, " ",)
	.
    .
    .
}

Bu işlemle birlikte cümlemizi kelimelerine ayırdığımız bir dilim oluşturduk.

2. Ayrılan kelimeleri ters çevir

go
func reverseWord(w string) string {
	result := []rune(w)

	for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
		result[i], result[j] = result[j], result[i]
	}

	return string(result)
}

w değişkeni ile gelen kelimemizi, harf listesine ayırdık ([]rune). Döngüde ise kelimenin ilk harfinden ve son harfinden başlayarak, kelimenin ortasına kadar gelerek harfleri liste üzerinde takas ettik ve sonucumuzu döndürdük.

kelime-reverse

3. Ters çevrilen kelimeleri birleştir.

go
func reverseWords(s string) string {
	words := strings.Split(s, " ")

	for i := range words {
		words[i] = reverseWord(words[i])
	}

	return strings.Join(words, " ")
}

Sonuç

go
func reverseWords(s string) string {
	words := strings.Split(s, " ")

	for i := range words {
		words[i] = reverseWord(words[i])
	}

	return strings.Join(words, " ")
}

func reverseWord(w string) string {
	result := []rune(w)

	for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
		result[i], result[j] = result[j], result[i]
	}

	return string(result)
}

veya alternatif olarak

go
func reverseWords(s string) string {
	words := strings.Split(s, " ")

	for i := range words {
		word := []rune(words[i])
		slices.Reverse(word)
		words[i] = string(word)
	}

	return strings.Join(words, " ")
}

Kaan Kuscu

Backend Developer

İletişim kurmak için İletişim sayfasını ziyaret edebilirsiniz.