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.
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ümüz genel olarak 3 parçadan oluşuyor.
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.
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.
func reverseWords(s string) string {
words := strings.Split(s, " ")
for i := range words {
words[i] = reverseWord(words[i])
}
return strings.Join(words, " ")
}
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
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, " ")
}